Мой вопрос, вероятно, довольно простой, но все же я не могу найти решение в официальном документе. Я определил цепочку Celery внутри своего приложения Django, выполняя набор задач, зависящих друг от друга:
chain( tasks.apply_fetching_decision.s(x, y),
tasks.retrieve_public_info.s(z, x, y),
tasks.public_adapter.s())()
Очевидно, что вторая и третья задачи нуждаются в выводе родителя, поэтому я использовал цепочку.
Теперь вопрос: мне нужно программно отменить 2-ю и 3-ю задачи, если условие проверки в 1-й задаче не выполняется. Как это сделать по-чистому? Я знаю, что могу отозвать задачи цепочки из метода, в котором я определил цепочку (см. thisвопрос и этот документ), но внутри первой задачи я не вижу ни последующих задач, ни самой цепочки.
Временное решение
Мое текущее решение состоит в том, чтобы пропустить вычисления внутри последующих задач на основе результата предыдущей задачи:
@shared_task
def retrieve_public_info(result, x, y):
if not result:
return []
...
@shared_task
def public_adapter(result, z, x, y):
for r in result:
...
Но у этого «обходного пути» есть недостаток:
- Добавляет ненужную логику к каждой задаче (на основе результата предыдущей), ставя под угрозу повторное использование
- По-прежнему выполняет последующие задачи со всеми возникающими накладными расходами
Я не слишком много играл с передачей ссылок на цепочку задачам из-за боязни все испортить. Я также признаю, что не пробовал подход с выбрасыванием исключений, потому что я думаю, что выбор не проходить через цепочку может быть функциональным (таким образом, не исключительным) сценарием...
Спасибо за помощь!