我有一个工作链,但是当我添加 apply_async()
时它只执行第一个任务。
@task(name='run_a', delay=True)
def run_a(**kwargs):
do_whatever(kwarg['var'])
return
@task(name='run_b', delay=True)
def run_b(**kwargs):
# ...
return
@task(name='run_c', delay=True)
def run_c(**kwargs):
# ...
return
使用链式命令:
ret = chain(
run_a.s(**kwargs),
run_b.s(**kwargs),
run_b.s(**kwargs)
).apply_async()
apply_async
这一切都按预期工作(同步)。 最佳答案
基于文档 http://docs.celeryproject.org/en/master/userguide/canvas.html#chains :链接的任务将以其父任务的结果作为第一个参数来应用。 .因此,要强制下一个链接任务不使用父结果作为参数,我们必须使用 .si() 快捷方式使任务不可变。所以我们必须重新编写链如下
In [29]: ret = chain(
...: run_a.si(**kwargs),
...: run_b.si(**kwargs),
...: run_c.si(**kwargs)
...: ).apply_async()
结果
In [30]: print ret.parent.parent.graph
0e1541f8-93c2-48c9-95b0-7a0a5971d74a(1)
7b5e11e4-6ccf-49cc-a1dd-42bf407a37de(0)
7b5e11e4-6ccf-49cc-a1dd-42bf407a37de(0)
70a6e66c-1ef9-4814-ae23-9c905ee1fcd5(2)
0e1541f8-93c2-48c9-95b0-7a0a5971d74a(1)
7b5e11e4-6ccf-49cc-a1dd-42bf407a37de(0)
关于django - 为什么 Celery 只运行链中的第一个任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36514597/