当我将任务路由到特定队列时,它可以工作:
task.apply_async(queue='beetroot')
但如果我创建一个链:
chain = task | task
然后我写
chain.apply_async(queue='beetroot')
它似乎忽略了queue关键字并分配给默认的'celery'队列。
如果芹菜支持链中的路由会很好 - 所有任务在同一队列中按顺序执行。
答案 0 :(得分:15)
我这样做:
subtask = task.s(*myargs, **mykwargs).set(queue=myqueue)
mychain = celery.chain(subtask, subtask2, ...)
mychain.apply_async()
答案 1 :(得分:10)
好的我找到了这个。
您必须将所需的执行选项(如queue =或countdown =)添加到子任务定义中,或者通过部分:
子任务定义:
from celery import subtask
chain = subtask('task', queue = 'beetroot') | subtask('task', queue = 'beetroot')
部分:
chain = task.s().apply_async(queue = 'beetroot') | task.s().apply_async(queue = 'beetroot')
然后通过以下方式执行链:
chain.apply_async()
,或者
chain.delay()
任务将被发送到'甜菜根'队列。最后一个命令中的额外执行参数不会执行任何操作。将所有这些执行参数应用于Chain(或Group,或任何其他Canvas原语)级别会很好。
答案 2 :(得分:4)
这已经很晚了,但我不认为@mpaf提供的代码是完全正确的。
上下文:在我的例子中,我有两个子任务,其中第一个提供一个返回值,它作为输入参数传递给第二个。我在执行第二个任务时遇到了麻烦 - 我在日志中看到Celery会将第二个任务确认为第一个任务的回调,但它永远不会执行第二个任务。
这是我的非工作链码 - :
from celery import chain
chain(
module.task1.s(arg),
module.task2.s()
).apply_async(countdown=0.1, queue='queuename')
使用@ mpaf的答案中提供的语法,我完成了两个任务,但执行顺序是随意的,第二个子任务未被确认为第一个的回调。我有想法浏览有关如何在子任务上显式设置队列的文档。
这是工作代码 - :
chain(
module.task1.s(arg).set(queue='queuename'),
module.task2.s().set(queue='queuename')
).apply_async(countdown=0.1)