gpt4 book ai didi

django - 为什么 Celery 只运行链中的第一个任务?

转载 作者:行者123 更新时间:2023-12-01 15:20:03 26 4
gpt4 key购买 nike

我有一个工作链,但是当我添加 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这一切都按预期工作(同步)。
  • 'kwargs' 是一个字典。
  • 最佳答案

    基于文档 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com