python-3.x - 关闭消费者时 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 得知的),但是该进程有效地挂起而不关闭通道和连接,直到清理兔子和操作系统发生了。
解决方案
推荐阅读
- go - httprouter 通过参数和 url 更新转发到另一个处理程序
- javascript - 使用 axios 将语言添加到标题
- php - Laravel 关系附加在 PestPHP 测试中失败,但在 PHPUnit 测试中有效
- json - 从 Firebase 数据库快照中解压布尔值?
- javascript - 如何在 _.chain 中转换 Lodash groupBy 的结果
- python-3.x - 如何将带有嵌套列表的字典写入 csv 并为每个嵌套值创建一个新行
- ios - SwiftUI 更新文本元素
- python - 壁虎中数组变量的总和
- doctrine-orm - 添加到数组集合多对多自引用 Api 平台 - 学说
- html - 按钮元素在另一台计算机上未正确对齐