9

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

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

没有使用特权子进程调用rabbitmqctl,我怎样才能从 python 中获取完整的排队任务计数,最好是通过celery(顺便说一下,这个服务器目前使用的是 Celery 3.1.8)

4

1 回答 1

10

Celery 的app.control.inspect将检查仅由运行 workers处理的任务。

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

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

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

看起来您已经启动了一个并发为 4 的工作人员(或在 4 核机器上使用默认设置的工作人员)。所以活动任务是 4 个。每个工作进程预取了 4 个任务,这导致了 16 个保留任务。

AFAIK,没有办法用芹菜获得队列中的任务总数。

但是,有几种 python 解决方案可以获取队列中的消息总数。您可以在此处查看我的其他答案,了解其他方法。

更新:

pika是一个与rabbitmq交互的python客户端。您可以使用它来消费消息。这是一个使用每条消息的简单示例。您可以在 pika 文档上查看更多使用示例。

于 2017-02-06T05:09:52.670 回答