保持pika BlockingConnection不会禁用心跳

时间:2017-09-05 11:02:20

标签: python-2.7 rabbitmq pika

我正在使用pika 0.10.0和python 2.7版本开发RabbitMQ使用者。在我的消费者客户端中,我有一个根据输入消息运行一段时间的进程。它可以在3到40分钟之间变化。 我不想禁用心跳。相反,我正在寻找一些回复机制,可以保持连接活着,直到delivery_tag被发回。这可能吗?

我收到的链接很少,所有人都建议禁用心跳作为解决方法。但我不想禁用它。

参考:

Socket Error: 104 consuming messages with task that take a long time #753

BlockingConnection gets closed unexpectedly #734

另外,如果需要任何额外信息,请告诉我。 提前谢谢。

2 个答案:

答案 0 :(得分:5)

唯一的解决方案是定期发送心跳帧。

使用BlockingConnection时,您必须经常调用process_data_events函数(一个time_limit为零)。使用SelectConnection或其他异步适配器时,您必须确保没有任何进程阻塞,以便可以发送帧。

如果您的任务长时间运行且由于某种原因您无法轻松中断或拆分该过程,则可以在另一个线程/进程中运行该任务,并且仍然可以从主线程发送pika帧。请记住,你应该避免在线程之间使用pika连接(目前pika不是线程安全的)。

答案 1 :(得分:2)

您将不得不使用额外的线程来通过BlockingConnection处理此问题。我用threading模块编写了一个简单的Producer和Consumer。

基本思想是

  1. 制作人。使用2个线程,当您在主线程中发布时,该消息将传递到内部队列,然后通信线程将使用该消息并将其发送到Rabbitmq。

  2. 消费者。您可以在主线程中调用conn.start_consumming,然后将所有消息传递到内部队列,并使用一些工作程序来消耗和处理这些消息。

源代码为here

我还没有涉及到一些会议,但是我认为基本思路可能会有所帮助。