Сельдерей: отменить или отменить все задачи в аккорде

Я использую следующую настройку с Redis Broker и Backend:

chord([A, A, A, ...])(B)

  • Задача А делает некоторые проверки. Оно использует AbortableTask в качестве базы и регулярно проверяет task.is_aborted() флаг.
  • Задача B уведомляет пользователя о результате расчета

Пользователь имеет возможность прервать выполнение задач. К сожалению при звонке AbortableAsyncResult(task_a_id).abort() во всех экземплярах задачи A отменяются только активные. Статус задач, которые еще не получены работником, изменяется на ABORTED, но они все еще обрабатываются и is_aborted() флаг возвращает False.

Я мог конечно revoke() нерешенные задачи вместо abort()их, но проблема в том, что в этом случае тело аккорда (задача B) больше не выполняется.

Как можно остановить все ожидающие и работающие экземпляры задачи A, при этом обеспечивая выполнение задачи B?

2 ответа

Просто получите список идентификаторов всех экземпляров A и останови их.

Рассмотрим этот простой аккорд

from celery import chord 

my_chord = chord(a.si() for i in range(300))(b.si())

Теперь вы можете получить список подзадач (все a задача) из my_chord Например, используя

for taks in my_chord.parent.subtasks:
    print(task.id)

Теперь вы можете делать все, что хотите с этими заданиями. Например, вы можете отозвать все, независимо от их текущего состояния.

from celery.task.control import revoke

for task in my_chord.parent.subtasks:
    revoke(task.id, terminate=True)

revoke по умолчанию убивает только отложенные задачи. Но если вы пройдете terminate=True к этому, это убивает также выполнение задач.

Кроме того, функция обратного вызова chord будет вызываться после успешного выполнения всех его подзадач. Так как вы отменяете подзадачи аккорда, функция обратного вызова не будет вызвана, и задача аккорда приведет к сбою. Итак, вы должны повторить задачу обратного вызова.

Вместо того, чтобы записывать сами задачи, вы можете захотеть использовать задачи с аккордами, которые следят за задачами А. Под этим я подразумеваю, что аккорд будет содержать задачи, которые очень часто проверяют запущенные задачи (A), чтобы увидеть, выполнены ли они или отменены. Когда все они успешно возвращают аккорд с цепочкой в ​​задачу B

Другие вопросы по тегам