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