在调用芹菜add_consumer之后,worker不会消耗任务

时间:2017-08-20 17:15:51

标签: python rabbitmq queue celery celery-task

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

Celery,通过调用add_consumercancel_consumer似乎有this capability。虽然我能够从特定工作人员的队列中取消任务消耗,但我无法通过调用add_consumer让工作人员恢复消费。 The code to reproduce this issue is provided here。我的猜测可能是我错过了某种参数,要么在celeryconfig中提供,要么在启动工作时通过参数提供?

很高兴看到一双新鲜的眼睛。 Stackoverflow关于add_consumer和Github的讨论不多。所以我希望这里有一些专家愿意分享他们的想法/经验。

-

我正在运行以下内容:

Windows操作系统,RabbitMQ 3.5.6,Erlang 18.1,Python 3.3.5,芹菜3.1.15

2 个答案:

答案 0 :(得分:2)

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

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被传递到state并且队列为空。所以它无法恢复。

答案 1 :(得分:0)

为了让芹菜工人恢复在Windows操作系统中工作,我的工作方式如下所示。

  • 更新芹菜:pip install celery == 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