为什么celery.control.inspect报告的排队任务少于rabbitmqctl?

时间:2016-11-29 03:01:37

标签: python rabbitmq celery rabbitmqctl

rabbitmqctl正确报告了数千个排队任务:

$ sudo rabbitmqctl -q list_queues name messages messages_ready messages_unacknowledged
default 13142   13126   16

然而芹菜报道:

>>> 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

正确的数量(数千)任务似乎出现在app.control.inspect().stats()['celery@default']['total']中,但我真的想知道python中正确的未完成排队任务的数量,{{1似乎只报告了16个左右 - 也许有一个限制?

如果不使用对active()的特权子进程调用,如何从python中获取完整的排队任务数,最好是通过rabbitmqctl(顺便说一下,这个服务器目前正在使用Celery 3.1.8)

1 个答案:

答案 0 :(得分:5)

Celery的app.control.inspect将检查仅由正在运行的工作人员处理的任务

即使您有数千个任务在队列中,您的工作人员也会在任何给定的时间点执行少量指定的任务。这些是active个任务。

除此之外,工作人员可以预取一些将为该工作人员保留的任务。这些将显示在reserved任务中。

如果您为自己的任务设置了ETA,或者如果有定期任务,则会有scheduled个任务。

看起来你已经启动了一个并发度为4的工作者(或者是4核计算机上具有默认设置的worker)。所以主动任务是4.每个工作进程预取了4个任务,这导致了16个保留任务。

AFAIK,无法获得芹菜队列中的任务总数。

然而,有几个python解决方案可以获取队列中的消息总数。您可以查看my other answer here以了解其他方法。

更新

pika是一个与rabbitmq交互的python客户端。您可以使用它来消费消息。这是每封邮件simple example to consume。您可以在pika docs上查看更多usage examples