我正在尝试在Celery任务中使用嵌套链。以下是我所面临的问题类型的人为举例。
add_tasks.py:
from celery import Celery, chain
app = Celery('add_tasks', broker='amqp://guest@localhost//')
app.conf.CELERY_RESULT_BACKEND = 'redis://localhost/0'
@app.task
def add(x, y):
return x + y
@app.task
def inner_chain(x):
# range parameter could change
task_list = [add.s(x,x)] + [add.s(x) for _ in xrange(10)]
return chain(*task_list)() #.get()
@app.task
def outer_chain():
return chain(
add.s(1,1),
inner_chain.s()
)() #.get()
add_tester.py:
from add_tasks import outer_chain
r = outer_chain.delay()
print r.get()
print r.get().get()
print r.get().get().get()
目前我将获得表格的输出:
Result-ID
Result-ID
Result
在我的两个链任务中取消注释.get()会导致死锁,并引发有关运行同步子任务的警告,但我不知道如何传递子任务的结果。
做出此类事情的正确方法是什么?我是否需要在任务中使用apply_async?