我有一个芹菜任务(超级任务),它进一步启动不同的芹菜任务(子任务)
@app.task
def super_task():
do_heavy_work()
@app.task
def sub_tasks():
do_something()
def do_heavy_work():
results = group(sub_tasks.s() for i in xrange(100))()
# Problem
# Once code reach below line any tasks in pending state will
# remain in pending state until below code executes
for _ in xrange(some_value):
if not all(r.ready() for r in results):
time.sleep(30)
else:
break
super_task.delay()
问题
如何使用某些信号或任何其他功能跟踪所有子任务的状态,而不将其保持在待处理状态
答案 0 :(得分:0)
我们用来解决这个问题的方法是celery命令中的-Ofair参数,如此处所述。 http://docs.celeryproject.org/en/latest/userguide/optimizing.html
Celery使用多处理为每个worker生成多个进程以并行执行任务。 现在,每个工作进程都可以预取任务以优化计算(默认为4)。
因此,当您开始轮询以查看任务是否准备就绪时,此工作进程预取的任何任务都将保持挂起状态。
通过使用Ofair参数,您可以告诉celery仅在当前任务完成时获取任务,因此轮询任务将永远不会预取任务。