Как гарантировать, что обратный вызов аккорда Celery будет вызван с неудачными подзадачами?Python

Программы на Python
Ответить
Anonymous
 Как гарантировать, что обратный вызов аккорда Celery будет вызван с неудачными подзадачами?

Сообщение Anonymous »

Я использую Chord в Celery, чтобы иметь обратный вызов, который вызывается, когда группа параллельных задач завершает выполнение. В частности, у меня есть группа функций, которые оборачивают вызовы внешнего API. Я хочу дождаться, пока все они вернутся, прежде чем обрабатывать результаты и обновлять свою базу данных в обратном вызове Chord. Я хотел бы, чтобы обратный вызов выполнялся после завершения всех вызовов API, независимо от их статуса.

Моя проблема в том, что функция обратного вызова вызывается только в том случае, если ни одна из подзадач группы не вызывает исключения. Однако если одна подзадача вызывает исключение, то вызывается дополнительный обработчик ошибок on_error() со строковым представлением Task_id аккорда. Остальные задачи в группе продолжают выполнение, но обратный вызов никогда не вызывается.

Я проиллюстрирую это примером ниже:

Код: Выделить всё

@app.task
def maybe_succeed():
divisor = randint(0, 10)
return 1 / divisor

@app.task
def master_task():
g = group([maybe_succeed.s() for i in range(100)])
c = g | chord_callback.s()
return c.delay()

@app.task
def chord_callback(results):
print 'Made it here!'
В приведенном выше примере вызов master_task() запустит все задачи в группе, однако обратный вызов никогда не будет вызван, потому что один из Maybe_succeed() завершится неудачно (если только вам не очень повезет!).



Сейчас я решаю эту проблему, перехватывая все исключения в моем эквиваленте Maybe_succeed(), чтобы аккорд никогда не прерывался. Я думаю, что это хорошее решение, хотя оно не кажется правильным.

Итак, мой вопрос:
Есть ли способ выполнить обратный вызов Celery Chord независимо от статуса возврата подзадач его группы?

Подробнее здесь: https://stackoverflow.com/questions/468 ... d-subtasks
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»