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

Why does celery.control.inspect report fewer queued tasks than 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,active() 等人似乎只报告了 16 个左右——也许有一个限制?

如果不使用特权子进程调用 rabbitmqctl,我如何从 python 中获取完整的排队任务计数,最好是通过 celery(顺便说一句,此服务器使用的是 Celery 3.1 .8 当前)

Celery 的 app.control.inspect 将检查 仅由 运行 workers.

处理的任务

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

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

如果您为任务设置了 ETA,或者如果有周期性任务,它们将属于 scheduled 个任务。

看起来您已经启动了一个并发为 4 的工作程序(或在 4 核机器上使用默认设置的工作程序)。所以active tasks是4个。每个worker进程预取了4个tasks,结果就是16个reserved tasks。

AFAIK,无法获取 celery 队列中的任务总数。

不过,有几种 python 解决方案可以获取队列中的消息总数。您可以检查 my other answer here 以了解其他方法。

更新:

pika 是一个 python 与 rabbitmq 交互的客户端。您可以使用它来消费消息。这是 pika 文档上的 simple example to consume each message. You can checkout more usage examples