我想在链中使用一个组(或块),例如:
chain(getRange.s(3), GROUP() , xsum.s() )
其中GROUP()
是一组double()
个任务,即group(double(0),double(1),double(2))
。
在How to chain a Celery task that returns a list into a group?中发布了一个类似的问题,但没有解释如何将组中的输出传递给链中的下一个任务。
@task
def getRange(x):
return range(x)
@task
def double(nr):
return nr*2
@task
def xsum(list):
return sum(list)
答案 0 :(得分:8)
我不相信有一种方法可以用单链中的当前基元来做到这一点。在你提到的问题中传递回调将不允许你在组任务完成时收听。最接近的是:
@task
def get_range(x):
return range(x)
@task
def mapper(nr):
return nr * 2
@task
def reducer(nrs):
return sum(nrs)
@task
def double_then_sum(nrs):
return (
group([mapper.s(nr) for nr in nrs]) |
reducer.s()
)()
ar = (get_range.s(3) | double_then_sum.s())() # call the procedure
ar.result.result # get the result
否则,您可以尝试使用dynamic chaining,这样可以提供更简单的解决方案,或者如果您不需要将分组任务并行运行,只需使用map
。