Python+Celery: 链接任务?
Celery的文档提到,让任务等待其他任务的结果其实不是个好主意……不过,文档中提到的解决方案(在“好”的部分)看起来也不是特别完美。具体来说,没有一个明确的方法可以把子任务的结果返回给调用者(而且,这种方式看起来有点复杂)。
那么,有没有办法“链接”多个任务,让调用者能得到最后一个任务的结果呢?比如,使用add
这个例子:
>>> add3 = add.subtask(args=(3, ))
>>> add.delay(1, 2, callback=add3).get()
6
另外,返回结果实例是否可以呢?比如:
@task
def add(x, y, callback=None):
result = x + y
if callback:
return subtask(callback).delay(result)
return result
这样的话,就可以通过一个简单的方式来获取链中“最后”任务的结果:
result = add(1, 2, callback=add3).delay()
while isinstance(result, Result):
result = result.get()
print "result:", result
1 个回答
39
你可以用一个叫做“celery chain”的东西来实现这个功能。具体可以参考这个链接:https://celery.readthedocs.org/en/latest/userguide/canvas.html#chains
@task()
def add(a, b):
time.sleep(5) # simulate long time processing
return a + b
工作链:
# import chain from celery import chain
# the result of the first add job will be
# the first argument of the second add job
ret = chain(add.s(1, 2), add.s(3)).apply_async()
# another way to express a chain using pipes
ret2 = (add.s(1, 2) | add.s(3)).apply_async()
...
# check ret status to get result
if ret.status == u'SUCCESS':
print "result:", ret.get()