我有一個芹菜鏈運行一些任務。每個任務都可能失敗並被重試。請參閱下面一個簡單的例子:重試芹菜失敗的任務是鏈條的一部分
from celery import task
@task(ignore_result=True)
def add(x, y, fail=True):
try:
if fail:
raise Exception('Ugly exception.')
print '%d + %d = %d' % (x, y, x+y)
except Exception as e:
raise add.retry(args=(x, y, False), exc=e, countdown=10)
@task(ignore_result=True)
def mul(x, y):
print '%d * %d = %d' % (x, y, x*y)
和鏈條:
from celery.canvas import chain
chain(add.si(1, 2), mul.si(3, 4)).apply_async()
運行兩個任務(並假設沒有失敗),你會得到/看印刷:
1 + 2 = 3
3 * 4 = 12
但是,當添加任務第一次失敗並在後續的重試調用中成功時,鏈中的其餘任務不會運行,即添加任務失敗,鏈中的所有其他任務都不會運行,並且在af幾秒後,添加任務再次運行併成功,鏈中的其餘任務(本例中爲mul.si(3,4))不會運行。
芹菜是否提供了一種方法來繼續從失敗的任務中繼續失敗鏈?如果不是,那麼完成此操作的最佳方法是什麼,並確保鏈的任務按照指定的順序運行,並且只有在前一個任務成功執行後纔會執行,即使任務重試了幾次也是如此。
注1:問題可以通過做
add.delay(1, 2).get()
mul.delay(3, 4).get()
來解決,但我想了解爲何鏈不失敗的任務。
我決定使用運行,否則將在鏈中的所有任務的連鎖任務,而是等待一個任務開始在另一個之前完成,如:'task1.delay([PARAMS])。得到(); 。task2.delay([PARAMS])得到(); task3.delay([PARAMS])。得到()'。鏈式任務可以捕獲任何任務引發的異常並重試自身。 – Andrei 2012-07-25 09:45:13
因此,從你的例子中,t1e和t2e必須分別調用t2和t3,對吧? – Andrei 2012-07-25 09:51:17
這個例子只是我對可能的鏈式語法的思考。這意味着每個接下來的任務,現在確實是對的任務,如果在上一步中沒有異常發生/錯誤對中第一個元素將被調用,第二個元素是上一步驟的失敗異常/錯誤處理程序。 't1e'的意思是't1錯誤處理程序' – anh 2012-07-25 10:01:54