Обратный вызов celery chord выполняется до завершения задач
У меня есть рабочий процесс celery, как показано на рисунке выше. Я сталкиваюсь со сценарием, в котором parent_task_callback выполняется до того, как будут выполнены все обратные вызовы sub_parent_task. Ни для одной из этих задач значение ignore_result не установлено в значение false, и я не устанавливал его глобально в значение false. Что я упускаю?
Код выглядит следующим образом:
@app.task
def sub_parent_task():
chord(child_tasks_list)(sub_parent_task_callback.si())
@app.task
def parent_task():
chord(sub_parent_tasks_list)(parent_task_callback.si())
Поскольку вы запускаете аккорд внутри каждого sub_parent_task, Celery автоматически не ожидает завершения этих внутренних обратных вызовов перед выполнением parent_task_callback. Чтобы гарантировать, что окончательный обратный вызов будет выполнен только после завершения всех дополнительных обратных вызовов, вам следует перестроить свой рабочий процесс таким образом, чтобы внешний аккорд непосредственно охватывал все внутренние аккорды.
@app.task
def parent_task():
# all_child_task_groups is a list of task lists
header = [
chord(child_tasks)(sub_parent_task_callback.s())
for child_tasks in all_child_task_groups
]
return chord(header)(parent_task_callback.s())
