DrM*_*ers 5 python rabbitmq celery rabbitmqctl
rabbitmqctl 正确报告数千个排队任务:
$ sudo rabbitmqctl -q list_queues name messages messages_ready messages_unacknowledged
default 13142 13126 16
Run Code Online (Sandbox Code Playgroud)
然而芹菜报道:
>>> len(app.control.inspect().active()['celery@default'])
4
>>> len(app.control.inspect().scheduled()['celery@default'])
1
>>> len(app.control.inspect().reserved()['celery@default'])
16
>>> len(app.control.inspect().revoked()['celery@default'])
0
Run Code Online (Sandbox Code Playgroud)
正确数量(数千)的任务似乎出现了app.control.inspect().stats()['celery@default']['total'],但我真的想知道python 中未完成的排队任务的正确数量,而且active()似乎只报告了大约16个左右 - 也许有一个限制?
如果没有使用特权子进程调用rabbitmqctl,我如何从python中获取完整的排队任务数,最好是通过celery(顺便说一下这个服务器当前正在使用Celery 3.1.8)
Celery的app.control.inspect将检查仅由正在运行的worker处理的任务.
即使您在队列中有数千个任务,您的工作人员也会在任何给定的时间点执行少量指定的任务.这些是active任务.
除此之外,工作人员可以预取一些将为该工作人员保留的任务.这些将显示在reserved任务中.
如果您已为任务设置了ETA,或者如果有定期任务,则它们将处于scheduled任务之下.
看起来你已经启动了一个并发为4的工作者(或者在4核计算机上具有默认设置的worker).所以主动任务是4.每个工作进程预取了4个任务,这导致了16个保留任务.
AFAIK,无法获得芹菜队列中的任务总数.
但是,有几个python解决方案可以获取队列中的消息总数.您可以在此处查看我的其他答案,了解其他方法.
更新:
pika是一个与rabbitmq交互的python客户端.您可以使用它来使用消息.以下是使用每条消息的简单示例.您可以在pika docs上查看更多用法示例.