首页 > 解决方案 > 关闭消费者时 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 得知的),但是该进程有效地挂起而不关闭通道和连接,直到清理兔子和操作系统发生了。

标签: python-3.xrabbitmqpika

解决方案


推荐阅读