如果其中一项任务失败,芹菜链就会中断

Posted

技术标签:

【中文标题】如果其中一项任务失败,芹菜链就会中断【英文标题】:Celery chain breaks if one of the tasks fail 【发布时间】:2013-06-21 21:26:06 【问题描述】:

如果其中一项任务失败,如果整个链条中断,Celery 链有什么意义?!!

我有这条芹菜链:

res = chain(workme.s ( y=1111 ), workme2.s( 2222 ), workme3.s( 3333 ),)() 

我让 workme2 失败,重试如下:

@celery.task(default_retry_delay=5, max_retries = 10, queue="sure") 
def workme2(x,y):
    # try:      
    try:
        print str(y)
        sleep(2)
        print str(x)
        ## adding any condition that makes the task fail
        if x!=None:
            raise Exception('Aproblem from your workme task')
        print 'This is my username: ' + str(x['user']) + \
               ' And Password: ' + str(x['pas'])        
        return "22xx"
    except Exception, exc:
        workme2.retry(args=[x,y], exc=exc,)

【问题讨论】:

***.com/questions/11508112/… @BernhardVallant,你好,我前几天下载了最新的,这是否意味着这个补丁不包括在内?? 如果它比 3.0.4 更新,我想它应该被包括在内... 我从github上的master分支下载了最新版本,是不是还需要做点别的。我只有一个问题要问你..你自己试过吗??如果你做过并为你工作过,请告诉我是的,并将来自 github 的下载链接发给我 【参考方案1】:

才是重点。

形成一个链意味着您的子任务具有某种串行依赖性:每个子任务只有在前一个已执行时才有意义。 如果没有这个,您将简单地使用队列或使用组而不是链。

因此,如果一个子任务失败(并且在尝试所有重试后仍然失败),则链失败。

我欣然承认the documentation(从 Celery 3.1.18 开始)在这方面远非明确,但其名称暗示了这种语义: “链条的强度取决于其最薄弱的环节。”

【讨论】:

好点 :) .. 我同意你的观点,文档中有一些模糊点

以上是关于如果其中一项任务失败,芹菜链就会中断的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重复的情况下重试芹菜任务 - SQS

结束芹菜工人的任务、时间限制、工作阶段或客户的指示

ExecutorService 在超时后中断任务

Celery Beat:一次限制为单个任务实例

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

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