Django celery redis удаляет заданную c periodi c задачу из очереди - PullRequest
4 голосов
/ 27 января 2020

Существует определенная c periodi c задача, которую необходимо удалить из очереди сообщений. Я использую конфигурацию Redis и сельдерея здесь.

tasks.py

@periodic_task(run_every=crontab(minute='*/6'))
def task_abcd():
    """
    some operations here
    """

В проекте есть и другие периодические c задачи, но мне нужно остановить эту конкретную c задачу, чтобы остановить ее сейчас на.

Как объяснено в этом ответе , будет работать следующий код?

@periodic_task(run_every=crontab(minute='*/6'))
def task_abcd():
    pass

Ответы [ 3 ]

3 голосов
/ 29 января 2020

В этом примере periodi c расписание задач определяется непосредственно в коде, то есть оно жестко запрограммировано и не может быть изменено динамически без изменения кода и повторного развертывания приложения.

Предоставленный код с логами задач c удалено или с простым return в начале - будет работать, но не будет ответом на вопрос - задача все еще будет выполняться, просто нет кода, который будет работать с ней.

Также , рекомендуется НЕ использовать @periodic_task:

"" "Устаревший декоратор, пожалуйста, используйте: setting: beat_schedule." ""

, поэтому не рекомендуется его использовать.


Сначала измените метод с @periodic_task на обычный сельдерей @task, и поскольку вы используете Django - лучше на go прямо для @shared_task:

from celery import shared_task

@shared_task
def task_abcd():
    ...

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

Для производства и при использовании нескольких рабочих не рекомендуется запускать работника сельдерея со встроенным ударом (-B) - запускать отдельный экземпляр планировщика ударов сельдерея.

Расписание может задано в celery.py или в django настройках проекта (settings.py).

Это все еще не очень динамично c, что касается Перечитанное приложение настроек необходимо перезагрузить.

Затем используйте Database Scheduler , который позволит динамически создавать расписания - какие задачи нужно запускать, когда и с какими аргументами. Он даже обеспечивает хорошие django административные веб-представления для администрирования!

2 голосов
/ 29 января 2020

Этот код будет работать, но я бы go за то, что не заставляет вас обновлять ваш код каждый раз, когда вам нужно отключить / включить задачу.

Что вы можете сделать, это использовать настраиваемая переменная, значение которой может исходить из панели администратора, файла конфигурации или чего-либо еще, и использовать ее для возврата перед выполнением кода, если задача находится в отключенном режиме.

Например:

@periodic_task(run_every=crontab(minute='*/6'))
def task_abcd():
    config = load_config_for_task_abcd()

    if not config.is_enabled:
        return

    # some operations here

Таким образом, даже если ваша задача запланирована, ее операции не будут выполнены.

0 голосов
/ 29 января 2020

Если вы просто хотите удалить задачу periodi c, попытались ли вы удалить функцию и затем перезапустить службу сельдерея. Вы можете перезапустить службу Redis, а также сервер Django для обеспечения безопасности.

Убедитесь, что на удаленную функцию больше нет ссылок.

...