Python芹菜如何和弦中等待所有子任务

2024-05-14 12:49:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我是芹菜单元测试任务。 我有链式任务,也有组,所以产生了和弦。

测试应如下所示:

  • 运行芹菜任务(延迟)
  • 等待任务和所有子任务
  • 断言

我尝试了以下方法:

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。 我对任务结果不感兴趣。 如何等待所有子任务完成?


Tags: or方法inchildforgetdef断言
2条回答

你试过和弦+回拨吗?

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

虽然这是一个老问题,我只是想分享我如何摆脱僵局的问题,以防万一它有助于某人。

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

我有一组类似的芹菜任务,其中包括一系列的小组任务,因此使它成为一个和弦。我使用tornado通过发出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

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

AsyncResult: 765b29a8-7873-4b28-b05c-7e19c33e950c

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

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

相关问题 更多 >

    热门问题