监视从任务启动的芹菜任务

时间:2017-07-16 19:24:05

标签: django asynchronous parallel-processing celery celery-task

我有一个芹菜任务(超级任务),它进一步启动不同的芹菜任务(子任务)

@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()

问题

如何使用某些信号或任何其他功能跟踪所有子任务的状态,而不将其保持在待处理状态

1 个答案:

答案 0 :(得分:0)

我们用来解决这个问题的方法是celery命令中的-Ofair参数,如此处所述。 http://docs.celeryproject.org/en/latest/userguide/optimizing.html

Celery使用多处理为每个worker生成多个进程以并行执行任务。 现在,每个工作进程都可以预取任务以优化计算(默认为4)。

因此,当您开始轮询以查看任务是否准备就绪时,此工作进程预取的任何任务都将保持挂起状态。

通过使用Ofair参数,您可以告诉celery仅在当前任务完成时获取任务,因此轮询任务将永远不会预取任务。

相关问题