У меня есть цепь сельдерея, которая выполняет некоторые задачи. Каждая из задач может быть неудачной и повторной. Ниже приведен быстрый пример:
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()
но мне интересно понять, почему цепочки не работают с неудачными задачами.