如何在Celery中的队列之间切换任务

时间:2015-04-01 15:07:21

标签: python multithreading celery message-queue django-celery

我在Celery的tasks.py中有几项任务。

# this should go to the 'math' queue 
@app.task
def add(x,y):
    uuid = uuid.uuid4()
    result = x + y
    return {'id': uuid, 'result': result}

# this should go to the 'info' queue
@app.task
def notification(calculation):
    print repr(calculation)

我想要做的是将每个任务放在一个单独的Celery队列中,然后在每个队列上分配一些工作人员。

问题是我不知道在我的代码中将任务从一个队列放到另一个队列的方法。

因此,例如当add任务完成执行时,我需要一种方法将生成的python字典放到info队列中以进行进一步处理。我该怎么办?

提前致谢。

编辑 - 澄清 -

正如我在评论中所说,问题主要在于工人如何将从queue A检索到的数据发送到queue B

1 个答案:

答案 0 :(得分:1)

你可以这样试试。

无论您在何处调用任务,都可以将任务分配到哪个队列。

add.apply_async(queue="queuename1")

notification.apply_async(queue="queuename2")

通过这种方式,您可以将任务放在单独的队列中。

单独队列的工作人员

celery -A proj -Q queuename1 -l info

celery -A proj -Q queuename2 -l info

但是你必须知道default队列是celery。所以如果没有指定queue name的任何任务将转到celery queue.So celery的消费者如果有的话就需要。

celery -A proj -Q queuename1,celery -l info

您的预期答案

如果你想将一个任务的结果传递给另一个任务。那么

result = add.apply_async(queue="queuename1")
result = result.get() #This contain the return value of task

然后

notification.apply_async(args=[result], queue="queuename2")