Подтвердить что ты не робот

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

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

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

Я нашел это из документа в Часто задаваемые вопросы о сельдере

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

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

4b9b3361

Ответ 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

Ответ 3

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

Ответ 4

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