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

标签 django celery chain

我有一个工作链,但是当我添加 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/

    相关文章:

    python - Celery 任务不在 PyCharm 调试器中运行

    openssl - 我可以在没有私钥的情况下将多个证书合并为一个吗?

    python - 带有外键的模型

    python - 配置celery等待后端服务启动

    python - celery "received unregistered task"

    jquery - 如何正确打破 promise 链?

    python - 如何使用 Django 模型查询获取缺失数据?

    python - 为什么Django无法加载Auth模块?

    python - Stripe API 请求被拆分发送到两个 Stripe 账户