【问题标题】:Pika Warning on Start Up due to Heartbeat Thread由于心跳线程而启动的 Pika 警告
【发布时间】:2019-10-15 14:14:28
【问题描述】:

我正在使用 pika 1.1.0 和 Python 2.7 连接到 RabbitMQ。 我正在使用 BlockingConnection 并运行一个监听器/消费者,它将不断地监听来自队列的消息。我还使用线程模块创建了一个单独的线程,该线程将每 60 秒发送一个心跳帧以保持正在运行的侦听器连接。心跳发送代码为:

blocking_connection._impl._send_frame(pika.frame.Heartbeat())
time.sleep(60)

几乎每次侦听器启动时,Pika 都会记录一个警告,说“在 fd=10 上指示写入,但写入器回调为无;”此警告从文件 pika.adapters.utils.selector_ioloop_adapter 打印。 但是当我阻止立即发送第一个心跳时,这意味着我将 60 秒睡眠线放在帧发送线之前,警告不会出现。

我试图了解实际发生的情况,为什么启动消费者/侦听器然后立即启动心跳线程会导致此警告?警告的意义和影响是什么?

提前感谢您提供的任何见解。

【问题讨论】:

    标签: python python-2.7 rabbitmq pika


    【解决方案1】:

    我还使用 threading 模块创建了一个单独的线程 将每 60 秒发送一个心跳帧以保持运行 监听器已连接。

    没有必要这样做。只要您的代码不阻塞 Pika 的 I/O 循环,Pika 就会为您发送心跳。此外,Pika 不是线程安全的,因此从另一个线程调用 _send_frame 可能会导致您看到的错误。

    如果您愿意,请在rabbitmq-userspika-python 邮件列表中分享您的代码,我会对其进行审核。我维护 Pika 库。


    注意:RabbitMQ 团队会监控rabbitmq-users mailing list,并且有时只回答 StackOverflow 上的问题。

    【讨论】:

    • 感谢您的回复。我将努力将其缩小到重现问题的代码子集,并在我得到它后分享。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2011-01-27
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多