У меня есть цепочка сельдерея, которая выполняет некоторые задачи. Каждая из задач может потерпеть неудачу и быть повторена. См. ниже краткий пример:
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
Однако, когда задача добавления терпит неудачу в первый раз и завершается успешно при последующих повторных вызовах, остальные задачи в цепочке не запускаются, т. е. задача добавления завершается со сбоем, все остальные задачи в цепочке не запускаются и через несколько секунд задача добавления запускается снова и завершается успешно, а остальные задачи в цепочке (в данном случае mul.si (3, 4 ))не запускаются.
Обеспечивает ли сельдерей способ продолжения неудачных цепочек от задачи, которая не удалась, и далее? Если нет, то каким будет наилучший подход к выполнению этого и обеспечению того, чтобы задачи цепочки выполнялись в указанном порядке и только после успешного выполнения предыдущей задачи, даже если задача повторяется несколько раз?
Примечание 1:Проблему можно решить, выполнив
add.delay(1, 2).get()
mul.delay(3, 4).get()
но мне интересно понять, почему цепочки не работают с неудавшимися задачами.