Остановка / чистка периодических задач в Джанго-сельдерее - PullRequest
7 голосов
/ 22 ноября 2011

Мне удалось получить периодические задания, работающие в django-сельдерее, с помощью подкласса PeriodicTask.Я попытался создать тестовое задание и запустить его, делая что-то бесполезное.Оно работает.

Теперь я не могу это остановить.Я прочитал документацию и не могу узнать, как удалить задачу из очереди выполнения.Я пытался использовать celeryctl и использовать оболочку, но registry.tasks () пуст, поэтому я не вижу, как его удалить.

Я видел предложения, которые я должен "отозвать", ноМне кажется, что для этого нужен идентификатор задачи, и я не вижу, как найти идентификатор задачи.

Спасибо.

Ответы [ 2 ]

21 голосов
/ 22 ноября 2011

Задача - это сообщение, а «периодическая задача» отправляет сообщения задачи через определенные промежутки времени. Каждой из отправленных задач будет присвоен уникальный идентификатор.

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)
3 голосов
/ 10 октября 2015

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

Возможно, вам следует сначала проверить, какой класс планировщика вы используете.

Планировщик по умолчанию - celery.beat.PersistentScheduler, который просто отслеживает последние времена выполнения в локальном файле базы данных (полке).

В нашем случае мы использовали djcelery.schedulers.DatabaseScheduler class.

django-celery также поставляется с планировщиком, который хранит расписание в базе данных Django

Хотя в документации упоминается способудалить периодические задачи:

С помощью планировщика django-celery вы можете добавлять, изменять и удалять периодические задачи из Django Admin.

Мы хотели выполнить удаление программно или с помощью команды (celery / management) в оболочке.

Поскольку мы не смогли найти командную строку, мы использовали оболочку django / python:

$ python manage.py shell
>>> from djcelery.models import PeriodicTask
>>> pt = PeriodicTask.objects.get(name='the_task_name')
>>> pt.delete()

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...