我有一个芹菜任务(超级任务(,它进一步启动不同的芹菜任务(子任务(
@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()
问题
如何使用某些信号或任何其他功能跟踪所有子任务的状态,而不会使它们处于挂起状态
我们用来解决这个问题的方法是芹菜命令中的 -Ofair 参数,如此处所述。 http://docs.celeryproject.org/en/latest/userguide/optimizing.html
Celery 使用多处理为每个工作线程生成多个进程以并行执行任务。 现在每个工作进程都可以预取任务以优化计算(默认值为 4(。
因此,当您开始轮询以查看任务是否已准备就绪时,此工作进程预取的任何任务都将保持挂起状态。
通过使用 Ofair 参数,您可以告诉芹菜仅在当前任务完成时获取任务,因此轮询任务永远不会预取任务。