從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
值將包含callback
的AsyncResult
實例,因爲在弦中的錯誤傳播給回調做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,我不介意一個提議)
我正在尋找這個相同的解決方案。 – 2015-04-13 11:50:02