【发布时间】: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