我正在测试芹菜任务。 我的连锁任务也有组,因此会产生和弦。
测试应该如下:
我尝试了以下内容:
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会永远重试。 我对任务结果不感兴趣。 我如何等待所有子任务完成?
答案 0 :(得分:3)
虽然这是一个老问题,但我只是想分享一下如何解决死锁问题,以防它对某人有所帮助。
就像芹菜日志所说的那样,永远不要在任务中使用get()
。这确实会造成僵局。
我有一套类似的芹菜任务,其中包括一系列团队任务,从而使它成为一个和弦。我通过发出HTTP请求,使用龙卷风来调用这些任务。所以我做的是这样的:
@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
当龙卷风调用celeryTask()
时,链将开始执行,& someTask()
的UUID将保留在job
中。它看起来像
AsyncResult:765b29a8-7873-4b28-b05c-7e19c33e950c
返回此UUID,celeryTask()
在链开始执行之前退出(理想情况下),从而为另一个进程留出空间。
然后我使用龙卷风层来检查任务的状态。有关龙卷风图层的详细信息,请参阅此stackoverflow question
答案 1 :(得分:-1)
你试过和弦+回调吗?
http://docs.celeryproject.org/en/latest/userguide/canvas.html#chords
>>> callback = tsum.s()
>>> header = [add.s(i, i) for i in range(100)]
>>> result = chord(header)(callback)
>>> result.get()
9900