Отменить уже выполняющуюся задачу с помощью Celery?
Я читал документ и искал, но не могу найти прямой ответ:
Можно ли отменить уже выполняющуюся задачу? (как при запуске задачи, требуется некоторое время, и на полпути через нее нужно отменить)
Я нашел это из документа в Часто задаваемые вопросы о сельдере
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
Но я не знаю, будет ли это отменять задачи в очереди или если он убьет рабочий процесс у рабочего. Спасибо за любой свет, который вы можете сбросить!
Ответы
Ответ 1
отменяет отмену выполнения задачи. Если задача отменена, рабочие игнорируют задачу и не выполняют ее. Если вы не используете постоянные аннулирования, ваша задача может быть выполнена после перезапуска рабочего.
http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes
Отмена имеет параметр завершения, который по умолчанию является False. Если вам нужно убить исполняемую задачу, вам нужно установить завершение в True.
>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)
http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks
Ответ 2
В Celery 3.1 изменен API отзыва задач.
В соответствии с Часто задаваемые вопросы по сельдеру, вы должны использовать result.revoke:
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()
или если у вас есть только идентификатор задачи:
>>> from proj.celery import app
>>> app.control.revoke(task_id)
Ответ 3
@0x00mh ответ правильный, однако недавний сельдерей docs говорит, что использование опции terminate
является "последним средством для администраторов", потому что вы можете случайно прекратить другая задача, которая начала выполняться тем временем. Возможно, лучшим решением является объединение terminate=True
с signal='SIGUSR1'
(что вызывает исключение SoftTimeLimitExceeded в задаче).
Ответ 4
См. следующие параметры для задач: time_limit, soft_time_limit (или вы можете установить его для работников). Если вы хотите контролировать не только время выполнения, то смотрите expires аргумент метода apply_async.
Ответ 5
Кроме того, неудовлетворительно, есть другой способ (прервать задачу), чтобы остановить задачу, но есть много ненадежности, более подробная информация: http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html