Отменить уже выполненную задачу с сельдереем?


Я читал документ и искал, но не могу найти прямой ответ:

можно ли отменить уже выполненную задачу? (как и в задаче стартовал, занимает некоторое время, и на полпути его нужно отменить)

Я нашел это из документа в сельдерей FAQ

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

но мне неясно, будет ли это отменять задачи в очереди или если это убьет запущенный процесс на рабочем месте. Спасибо за любой свет можно пролить!

4 69

4 ответа:

отменить отмена выполнения задачи. Если задача отменена, рабочие игнорируют задачу и не выполняют ее. Если вы не используете постоянные отмены, ваша задача может быть выполнена после перезапуска рабочего.

http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes

revoke имеет опцию завершения, которая False по умолчанию. Если вам нужно убить выполняемую задачу, вам нужно установить terminate к правда.

>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks

В сельдерее 3.1, то API отзыва задач изменяется.

по словам сельдерей FAQ, вы должны использовать результат.отозвать:

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

или если у вас есть только ID задача:

>>> from proj.celery import app
>>> app.control.revoke(task_id)

@0x00mh ответ правильный, однако недавний сельдерей docs говорят, что с помощью Это "последнее средство для администраторов" потому что вы можете случайно завершить другую задачу, которая начала выполнения в то же время. Возможно, лучшим решением является объединение terminate=True С signal='SIGUSR1' (что приводит к возникновению исключения SoftTimeLimitExceeded в задаче).

см. следующие параметры для задач: time_limit,soft_time_limit (или вы можете установить его для рабочих). Если вы хотите контролировать не только время выполнения, то смотрите истекает