Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python芹菜-如何在chord中等待所有子任务_Python_Celery_Celery Task_Chord - Fatal编程技术网

Python芹菜-如何在chord中等待所有子任务

Python芹菜-如何在chord中等待所有子任务,python,celery,celery-task,chord,Python,Celery,Celery Task,Chord,我正在单元测试芹菜任务。 我有链式任务,也有组,因此产生了和弦 测试应该如下所示: 运行芹菜任务(延迟) 等待任务和所有子任务 断言 我尝试了以下方法: def wait_for_result(result): result.get() for child in result.children or list(): if isinstance(child, GroupResult): # tried looping over task r

我正在单元测试芹菜任务。 我有链式任务,也有组,因此产生了和弦

测试应该如下所示:

  • 运行芹菜任务(延迟)
  • 等待任务和所有子任务
  • 断言
我尝试了以下方法:

def wait_for_result(result):
    result.get()
    for child in result.children or list():
        if isinstance(child, GroupResult):
           # tried looping over task result in group
           # until tasks are ready, but without success 
           pass
        wait_for_result(child)
这将创建一个死锁,将永远重试chord_unlock。 我对任务结果不感兴趣。
如何等待所有子任务完成?

您是否尝试过chord+回调


虽然这是一个老问题,但我只是想和大家分享一下我是如何摆脱僵局的,以防万一这会对别人有所帮助

正如芹菜日志所说,不要在任务中使用
get()
。这确实会造成僵局

我有一套类似的芹菜任务,其中包括一连串的小组任务,因此引起了共鸣。我通过发出HTTP请求,使用tornado调用这些任务。所以我做的是这样的:

@task
def someFunction():
    ....


@task
def someTask():
    ....


@task
def celeryTask():
    groupTask = group([someFunction.s(i) for i in range(10)])

    job = (groupTask| someTask.s())

    return job
当tornado调用
celeryTask()
时,链将开始执行,
someTask()
的UUID将保存在
job
中。看起来像

异步结果:765b29a8-7873-4b28-b05c-7e19c33e950c

返回此UUID,并且在链开始执行之前退出
celeryTask()
(理想情况下),从而为另一个进程的运行留下空间

然后,我使用tornado层来检查任务的状态。有关龙卷风层的详细信息,请参见

@task
def someFunction():
    ....


@task
def someTask():
    ....


@task
def celeryTask():
    groupTask = group([someFunction.s(i) for i in range(10)])

    job = (groupTask| someTask.s())

    return job