Z github emisji #1881 jeżeli zwrotna ma zestaw link_error
opcja, która pobiera listę nazw zadań, a następnie, gdy zadanie cięciwy nie zadania link_error będą wykonywane.
@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()
ten wykona akord iw dzienniku selera, zobaczysz zadanie raise_exception
niepowodzeniem i wykonanie error_callback
który otrzyma w to args z task_id z callback
.
W tym momencie wartość result
zawierać będzie wystąpienie callback
AsyncResult
, a ze względu na akord błędy propagowane do zwrotnego robi result.get()
podniesie wyjątek zadań i result.traceback
daje traceback.
Jeśli chcesz mieć jeden zwrotnego, po prostu przekazać nazwę zwrotnego akordów do link_error
callback.s().set(link_error='super_task.callback')
UWAGA
Another opcje To ustawienie CELERY_CHORD_PROPAGATES = False
który powróci do wcześniej selera 3.1 zachowanie i zawsze wywoływać wywołanie zwrotne.
Ale nie jest to zalecane podejście, bo jak można znaleźć w numerze github #1349
Seler 3,1 określa, jak błędy akordów są obsługiwane, poprzednie zachowanie nigdy nie zostało udokumentowane i więcej od wypadku, ponieważ nigdy nie było intencją pracy w ten sposób.
Nie mogliśmy zmienić zachowania w wydaniu poprawkowym, dlatego trzeba było użyć ustawienia, , ale nigdy nie było intencją, aby ktoś świadomie wyłączył nowe zachowanie.
Nowe zachowanie ma na celu ochronę przed tego typu problemami, a ustawienie zgodne z poprzednimi wersjami może zostać usunięte. Proponuję znaleźć inny sposób na obsługę błędów tutaj (i nie miałbym nic przeciwko propozycji, jeśli możesz wymyślić dla niej fajne API).
Szukam tego samego rozwiązania. –