Задача - это сообщение, а «периодическая задача» отправляет сообщения задачи через определенные промежутки времени. Каждой из отправленных задач будет присвоен уникальный идентификатор.
revoke
отменяет только одно сообщение задачи. Чтобы получить идентификатор для задачи, вы должны сохранить
отслеживать отправленный идентификатор, но вы также можете указать пользовательский идентификатор при отправке задачи.
Я не уверен, хотите ли вы отменить одно сообщение задачи или хотите, чтобы периодическая задача не отправляла больше сообщений, поэтому я перечислю ответы для обоих.
Не существует встроенного способа сохранить идентификатор задачи, отправляемой с периодическими задачами,
но вы можете установить идентификатор для каждой задачи в качестве имени периодической задачи, таким образом
идентификатор будет относиться к любой задаче, отправленной с периодической задачей (обычно последней).
Вы можете указать свой идентификатор таким образом,
либо с декоратором @periodic_task
:
@periodic_task(options={"task_id": "my_periodic_task"})
def my_periodic_task():
pass
или с настройкой CELERYBEAT_SCHEDULE
:
CELERYBEAT_SCHEDULE = {name: {"task": task_name,
"options": {"task_id": name}}}
Если вы хотите удалить периодическое задание, просто удалите @periodic_task
из кодовой базы или удалите запись из CELERYBEAT_SCHEDULE
.
Если вы используете планировщик базы данных Django, вы должны удалить периодическое задание
из интерфейса администратора Django.
PS1: revoke
не останавливает задачу, которая уже была запущена. Это только отменяет
задачи, которые еще не были начаты. Вы можете прекратить выполнение задачи, используя
revoke(task_id, terminate=True)
. По умолчанию это отправит сигнал TERM
процесс, если вы хотите отправить другой сигнал (например, KILL), используйте
revoke(task_id, terminate=True, signal="KILL")
.
PS2: revoke - это команда дистанционного управления, поэтому она поддерживается только RabbitMQ.
и Redis брокерские перевозки.
Если вы хотите, чтобы ваша задача поддерживала отмену, вы должны сделать это, сохраняя cancelled
пометить в базе данных и попросить задачу проверить этот флаг при запуске:
from celery.task import Task
class RevokeableTask(Task):
"""Task that can be revoked.
Example usage:
@task(base=RevokeableTask)
def mytask():
pass
"""
def __call__(self, *args, **kwargs):
if revoke_flag_set_in_db_for(self.request.id):
return
super(RevokeableTask, self).__call__(*args, **kwargs)