芹菜 - 中间的子任务失败后有没有办法继续执行链

Posted

技术标签:

【中文标题】芹菜 - 中间的子任务失败后有没有办法继续执行链【英文标题】:Celery - is there way to continue executing chain after subtasks in the middle failed 【发布时间】:2013-02-23 04:40:43 【问题描述】:

我需要找到在任何中间子任务引发异常后如何继续使用 immutable=True 子任务执行链的方法。

我已经读过这个thread 和这个issue comment。现在这些错误已修复,但我需要实现相反的行为。我不需要停止我的链执行。可能还有另一种方法可以以任何顺序一个接一个地执行独立任务列表而不在它们之间发送结果?而且我需要异步执行它们,因为在这种情况下 django-celery 将存储有关每个任务的统计信息。

一种解决方案是使用以下内容覆盖所有子任务的主体:

try:
    ...
except Exception, e:
    logger.error('Exception raised: %s' % e)
    raise e

但在这种情况下,所有子任务都将以 SUCCESS 状态执行,并且 django-celery 管理界面中的异常回溯将毫无用处。

【问题讨论】:

我也有同样的问题,有解决办法吗? @reptilicus 不,我没找到。结果我完全重构了我的芹菜画布结构并开始使用 PeriodicTask,它每分钟以平衡的方式启动另一个任务 那真是太糟糕了! 【参考方案1】:

竖琴使用和弦和CELERY_CHORD_PROPAGATES

因此,当 Chord 的某个子部分失败时,您可以管理异常并使用它做您想做的事情(记录某些内容、重新排列任务以进行更改执行等)。

由于你已经有了一个链,Chord 只是它的一部分,你需要知道状态的任务。

【讨论】:

我不认为这是解决方案,因为我不需要像在弦中那样并行运行所有子任务:“现在你可以使用弦来并行计算每个加法步骤,然后得到结果数字的总和:“从这里docs.celeryproject.org/en/latest/userguide/canvas.html#chords 我最好弄清楚你的需求。我今天没有时间自己测试它,但是在此处的文档中:docs.celeryproject.org/en/latest/userguide/canvas.html#groups 它指出组 call 是一个接一个地启动关于结果的。 这些只是在你调用sync时说的。当您调用组 async 时,它们可以很好地并行执行。段落中的第一句话是“一个组可用于并行执行多个任务。

以上是关于芹菜 - 中间的子任务失败后有没有办法继续执行链的主要内容,如果未能解决你的问题,请参考以下文章

芹菜停止执行链

Django 学习之Celery(芹菜)

从芹菜任务中获取芹菜工人的名字?

顺序芹菜任务执行

芹菜:在特定时间间隔后执行任务

我正在为我的测试项目使用 MStest (.net core),有没有办法在失败时继续执行测试?