【问题标题】:Celery check pending tasks number before specified taskid芹菜检查指定taskid之前的待处理任务编号
【发布时间】:2018-02-28 01:30:49
【问题描述】:

celery 是否支持在给定任务 id 之前返回待处理任务编号?

例如,没有启动 celery worker,我推送 task1、task2、task3,这三个都是待处理的,现在,我想要的是,如果我给 task3,它告诉我在 3 之前有 2 个待处理的任务。

我使用 celery celery 4.1,rabbitmq 3.5.4 作为代理,redis 3.2.9 作为结果后端。

虽然我可以通过管理 API(例如 pyrabbit 包中的 get_queue_depth)获取兔子队列深度,但这会导致整个队列深度,而不是指定任务 id 之前的待处理数。

而且我知道我可以自己维护一个队列来管理推送的任务 ID。

但我想知道芹菜或rabbitmq本身是否有任何简单的方法。

谢谢。

【问题讨论】:

  • 遇到了同样的问题。

标签: python rabbitmq celery


【解决方案1】:

我不确定它是否能回答您的问题,但有 control client 可以帮助您检查 reserved 任务、active 任务等等..

i = app.control.inspect()
i.reserved()

#output:
[{'worker1.example.com':
    [{'name': 'tasks.sleeptask',
      'id': '32666e9b-809c-41fa-8e93-5ae0c80afbbf',
      'args': '(8,)',
      'kwargs': '{}'}]}]

更多信息:http://docs.celeryproject.org/en/latest/userguide/workers.html#dump-of-reserved-tasks

您也可以从命令行监控/检查:http://docs.celeryproject.org/en/latest/userguide/monitoring.html#commands

【讨论】:

  • 虽然 i.reserved() 中的任务是列表,但顺序并不完全按照执行的顺序。所以,这应该行不通。
  • @Wesley 你试过了吗?
  • not yet... 我想你想禁用消息预取,我需要想办法关闭这个家伙,似乎设置 CELERYD_PREFETCH_MULTIPLIER = 1 是不够的,但首先出现的问题是,设置这个家伙为 1 会降低性能。不知道有没有其他方法不降低性能
  • 我正在使用高负载的 celery 并设置这个(用于使用优先级队列) - 这应该不是问题。顺便说一句,您仍然可以增加工作人员的并发性..
  • stackoverflow.com/questions/16040039/… 这篇文章解释了很多关于预取的内容。但是,到目前为止,我们犯了一个致命的错误……那就是,inspect 仅适用于运行 celery 工人,而不适用于 rabbitmq。我们无法从 celery inspect 获取 rabbitmq 中的待处理任务。我认为我们必须从 mq 方面解决问题。我正在考虑 pyrabbit 包的 get_messages。
猜你喜欢
  • 2014-10-02
  • 1970-01-01
  • 2023-03-29
  • 2014-05-29
  • 2015-04-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
相关资源
最近更新 更多