worker 在调用 celery add_consumer 后不消费任务

worker does not consume tasks after celery add_consumer is called

我想利用 Celery(使用 RabbitMQ 作为后端 MQ)通过不同的队列执行不同风格的任务。一个要求是来自特定队列的(由工作人员)消费应该具有暂停和恢复的能力。

芹菜,好像有this capability via calling add_consumer and cancel_consumer. While I was able to cancel the consumption of tasks from a queue for a particular worker, I cannot get the worker to resume consumption by calling add_consumer. The code to reproduce this issue is provided here。我的猜测可能是我缺少某种在 celeryconfig 中或在启动工作人员时通过参数提供的参数?

如果能对此有一些新的看法,那就太好了。 Whosebug 上关于 add_consumer 和 Github 的讨论不多。所以我希望这里有一些专家愿意分享他们的 thoughts/experience.

--

我是下面的运行:

Windows OS, RabbitMQ 3.5.6, Erlang 18.1, Python 3.3.5, 芹菜 3.1.15

要从队列中恢复,您需要指定队列名称以及目标工作器。这是如何做的。

app.control.add_consumer(queue='high', destination=['celery@asus'])

这是add_consumer签名

def add_consumer(state, queue, exchange=None, exchange_type=None,
             routing_key=None, **options):

在你的例子中,你正在用

打电话
app.control.add_consumer('high', destination=['celery@high1woka'])

所以 high 正在传递到状态并且队列为空。所以它无法恢复。

为了让芹菜工人在 Windows OS 恢复工作,我的解决方法如下所列。

  • 更新芹菜:pip 安装芹菜==4.1.0
  • 更新 billiard/spawn.py : 用 try: except: pass
  • 封装第 338 到 339 行
  • (可选)安装eventlet:pip install eventlet==0.22.1
  • 根据 https://github.com/celery/celery/issues/4178
  • 中的评论启动工人时添加 --pool=eventlet--pool=solo