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

Monitor celery tasks launched from 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()

问题

如何使用某些信号或任何其他功能跟踪所有子任务的状态而不使它们保持挂起状态

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

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

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

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