2015-03-30 52 views
6

是否有可能運行一個chord回調即使主要任務失敗了?運行和絃回調即使主任務失敗

我已經創建了我加了一堆任務,並註冊一個回調到它的心絃。我的問題是,如果任務失敗一個回調不會被觸發,但我想回調觸發兩種方式。

我試圖註冊SI()回調(immutability

callback = tasks.run_delete_rule.si([timestamp]) 
header = [tasks.run_update_rule.s(i, timestamp) for i in item_ids] 
result = chord(header)(callback) 

我也試圖帕拉姆ignore_result=True添加到這兩個任務的裝飾,但沒有成功。

+1

我正在尋找這個相同的解決方案。 – 2015-04-13 11:50:02

回答

5

從github問題#1881如果回調具有link_error選項集,其中包含任務名稱列表,那麼當和絃任務失敗時,將執行link_error任務。

@task(name='super_task.good') 
def good(): 
    return True 

@task(name='super_task.raise_exception') 
def raise_exception(): 
    raise ValueError('error') 

@task(name='super_task.callback') 
def callback(*args, **kwargs): 
    logger.info('callback') 
    logger.info(args) 
    logger.info(kwargs) 
    return 'finished' 

@task(name='super_task.error_callback') 
def error_callback(*args, **kwargs): 
    logger.info('error_callback') 
    logger.info(args) 
    logger.info(kwargs) 
    return 'error' 

>>> c = chord(
     [raise_exception.s(), good.s(), raise_exception.s()], 
     callback.s().set(link_error=['super_task.error_callback']) 
    ) 
>>> result = c() 

這將執行和絃和你的芹菜日誌中,你會看到raise_exception任務失敗,並error_callback執行將接收它的參數的個數callback的TASK_ID。

此時的result值將包含callbackAsyncResult實例,因爲在弦中的錯誤傳播給回調做result.get()將提高任務異常,並result.traceback給你回溯。

如果你想有一個回調,只是通過弦回調的名稱link_error

callback.s().set(link_error='super_task.callback') 

注意

它設置CELERY_CHORD_PROPAGATES = False另一個選項,這將恢復到前芹菜3.1行爲並始終執行回調。

但是,這不是一個推薦的方法,因爲你可以在GitHub的問題#1349

芹菜3.1定義瞭如何和絃錯誤的處理,以前的行爲從來沒有,因爲它記錄 ,更意外的發現從來沒有打算這樣工作。

我們無法更改錯誤修復發佈中的行爲,因此必須使用設置 ,但從來沒有人有意故意禁用新行爲。

新的行爲是存在的,以防止此類問題的發生,並且向後兼容設置可能會被刪除。我建議你在這裏找到一些其他的方式來處理錯誤(如果你能發明一個漂亮的API,我不介意一個提議)

+0

如何在error_callback中獲得好任務的結果? – Carl 2015-11-19 01:19:09

+0

@Carl我不是100%確定,但我不認爲你可以。我認爲你可以得到的唯一屬性是失敗任務的異常和回溯。如果您以後需要某些特定的內容即使一切都失敗,也可以使用數據存儲。我們只是需要它來發送和發送電子郵件,所以我沒有太多打。 – alejandrodnm 2015-11-19 08:07:51

+0

根據接受代碼,我得到錯誤回調運行,但和絃功能仍然引發異常,不從錯誤回調返回值... – Wesley 2017-07-10 08:15:04

相關問題