Повторная попытка неудачных задач celery, которые являются частью цепочки

У меня есть цепочка сельдерея, которая выполняет некоторые задачи. Каждая из задач может потерпеть неудачу и быть повторена. См. ниже краткий пример:

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()

но мне интересно понять, почему цепочки не работают с неудавшимися задачами.

16
задан Banana 20 August 2014 в 20:14
поделиться