当关闭消费者时,Pika挂起

时间:2019-04-02 17:28:32

标签: python-3.x rabbitmq pika

我在python3上使用pika来消耗RabbitMQ上的队列。我的消费者应该在某些事件上停止/被杀死,因此它应该能够自行处理关闭通道和连接的问题。经过一番磨合后,我发现我有很多“僵尸消费者”(为了更好的称呼,他们是Rabbit上的注册消费者,他们身边没有被确认的消息,但通常没有匹配的过程了)留下来。

经过一些实验,我发现,当我尝试运行channel.cancel()时,该过程将挂起,直到有其他原因将其杀死,然后,Rabbit认为该消费者仍然活跃了一段时间(我想20分钟)。

我的代码如下:

def do_some_work(method_frame, body):
  # something happens here
  if condition:
       logging.info("Closing up...")
       requeue = channel.cancel()
       logging.info("Consumer stopped, {0} messages sent back".format(requeue))

for method_frame, properties, body in channel.consume(args.queue):
    do_some_work(method_frame, body)

遇到condition时,我可以看到第一条日志行以及从Rabbit获取更多消息的请求停止了(至少这是我可以从Rabbit告诉的内容),但是该过程有效地挂起了,而没有关闭通道和连接,直到从Rabbit和操作系统清除为止。

0 个答案:

没有答案