Отменить уже выполняемое задание с помощью сельдерея? - PullRequest
83 голосов
/ 19 января 2012

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

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

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

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

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

Ответы [ 5 ]

153 голосов
/ 19 января 2012

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

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

revoke имеет параметр завершения, который по умолчанию равен 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

31 голосов
/ 29 августа 2014

В Celery 3.1 изменен API отзыва задач .

В соответствии с Celery FAQ , вы должны использовать result.revoke:

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

или если у вас есть только идентификатор задачи:

>>> from proj.celery import app
>>> app.control.revoke(task_id)
20 голосов
/ 14 апреля 2015

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

1 голос
/ 19 января 2012

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

0 голосов
/ 06 декабря 2018

Кроме того, неудовлетворительно, есть другой способ (отменить задачу), чтобы остановить задачу, но есть много ненадежных, более подробную информацию см.

...