【问题标题】:How to chain tasks in celery如何在 celery 中链接任务
【发布时间】:2019-06-21 18:04:50
【问题描述】:

我希望能够在 celery 中链接任务,以便第二个任务仅在第一个任务完成后执行。

在下面的示例中,我声明了 2 个任务。 hello()world()。我希望 world() 仅在 hello() 完成后执行。

tasks.py

import os
from celery import Celery
from time import sleep


CELERY_BROKER = "pyamqp://guest@localhost//"

app = Celery('tasks', broker=CELERY_BROKER)


@app.task
def hello():
    sleep(2)  # simulate slow computation
    return "Hello"
@app.task
def world():
    sleep(2)  # simulate slow computation
    return "World"

api.py

from celery import chain
res = chain(hello.delay(), world.delay())
print(res)

这会引发以下错误:

TypeError: |: 'AsyncResult' 和不支持的操作数类型 '异步结果'

【问题讨论】:

  • 当您链接两个任务并且第一个任务返回一个值时,第二个任务应该接受一个参数,该参数是第一个任务的返回值。换句话说,尝试声明 def world(arg_result_of_hello) 而不是 def world()
  • 如果您不想将第一个任务的结果作为参数传递给第二个任务,请使用chain(hello.si(), world.si()).delay()

标签: python python-3.x celery


【解决方案1】:

了解 Celery Canvas 的链原语(工作流程)。我建议阅读整个Canvas: Designing Work-flows 部分。自然,它会讨论如何像您描述的那样构建task chains

【讨论】:

    猜你喜欢
    • 2014-11-03
    • 2019-10-20
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 2017-03-27
    • 2016-06-17
    • 2013-02-13
    • 2013-10-24
    相关资源
    最近更新 更多