Celery任务调度:并行任务完成后执行后续任务(无需传递结果)
解决Celery任务顺序执行且不传递参数的问题
方案1:使用Chord结合Immutable Signature
Celery的chord原生支持等待一组并行任务全部完成后执行回调,而通过si()(Immutable Signature)创建的任务签名会忽略所有传入参数,刚好匹配你不需要传递前两个任务结果给xsquare的需求。
修改后的代码如下:
@app.task def xsum(): return sum(i + i for i in range(100)) @app.task def xmult(): return sum(i * i for i in range(100)) @app.task def xsquare(): return sum(i * i for i in range(100)) # 创建并行执行的任务组 xsum_mult_group = group(xsum.s(), xmult.s()) # 用chord绑定组任务与回调,si()确保xsquare不接收任何参数 chord(xsum_mult_group)(xsquare.si())
关键说明
group(xsum.s(), xmult.s()):生成并行任务组,xsum和xmult会同时启动执行xsquare.si():si()是signature(immutable=True)的简写,生成的签名会自动忽略所有传入的参数,避免前两个任务的返回值被传递给xsquarechord(组任务)(回调任务):chord会阻塞等待组内所有任务执行完毕,再触发回调任务,严格保证执行顺序
方案2:使用Chain串联Group与任务
如果更习惯用chain,也可以直接把并行任务组和xsquare.si()串联起来,效果完全一致:
from celery import chain chain(xsum_mult_group, xsquare.si()).apply_async()
这样xsum和xmult并行执行完成后,会自动触发xsquare,且不会传递任何参数。
内容的提问来源于stack exchange,提问作者Aditya Ganguli
相关产品推荐
相关产品推荐

