【问题标题】:Why does celery.control.inspect report fewer queued tasks than rabbitmqctl?为什么 celery.control.inspect 报告的排队任务比 rabbitmqctl 少?
【发布时间】:2017-04-12 22:17:45
【问题描述】:

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

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

然而 celery 报告:

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

【问题讨论】:

    标签: python rabbitmq celery rabbitmqctl


    【解决方案1】:

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

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

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

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

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

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

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

    更新:

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

    【讨论】:

    • 谢谢!我还可以获取队列中每条消息使用pika 等的详细信息,还是仅获取队列中消息的总数?
    • 感谢@ChillarAnand;通过pika“消费”消息是否将它们安全地留在队列中等待芹菜处理?如果是这样,这是一个很好的解决方案
    • @DrMeers 我认为没有办法。但是,您可以使用和重新排队消息rabbitmq.1065348.n5.nabble.com/…
    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    相关资源
    最近更新 更多