我在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和操作系统清除为止。