Отменить уже выполненную задачу с сельдереем?
Я читал документ и искал, но не могу найти прямой ответ:
можно ли отменить уже выполненную задачу? (как и в задаче стартовал, занимает некоторое время, и на полпути его нужно отменить)
Я нашел это из документа в сельдерей FAQ
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
но мне неясно, будет ли это отменять задачи в очереди или если это убьет запущенный процесс на рабочем месте. Спасибо за любой свет можно пролить!
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 (или вы можете установить его для рабочих). Если вы хотите контролировать не только время выполнения, то смотрите истекает