Джанго - настроить запланированное задание? - PullRequest
472 голосов
/ 21 февраля 2009

Я работал над веб-приложением с использованием Django, и мне любопытно, есть ли способ запланировать периодическое выполнение задания.

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

Кто-нибудь знает, как это настроить?

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

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

Ответы [ 23 ]

331 голосов
/ 21 февраля 2009

Одно из решений, которое я использовал, заключается в следующем:

1) Создайте пользовательскую команду управления *1003*, например,

python manage.py my_cool_command

2) Используйте cron (в Linux) или at (в Windows) для запуска моей команды в требуемое время.

Это простое решение, которое не требует установки тяжелого стека AMQP. Тем не менее, есть и другие преимущества использования чего-то вроде сельдерея, упомянутые в других ответах. В частности, с Celery было бы неплохо не распространять логику вашего приложения в файлы crontab. Однако решение cron прекрасно работает для приложений малого и среднего размера, где вам не нужно много внешних зависимостей.

EDIT:

В более поздней версии Windows команда at устарела для Windows 8, Server 2012 и выше. Вы можете использовать schtasks.exe для того же использования.

138 голосов
/ 29 июня 2009

Celery - это распределенная очередь задач, построенная на AMQP (RabbitMQ). Он также обрабатывает периодические задачи в стиле крона (см. периодические задачи ). В зависимости от вашего приложения это может стоить того.

Celery довольно легко настроить с помощью django ( docs ), и периодические задачи фактически пропускают пропущенные задачи в случае простоя. В сельдере также есть встроенные механизмы повтора на случай, если задача не удалась.

47 голосов
/ 31 января 2012

Мы с открытым исходным кодом, что я думаю, является структурированным приложением. это решение Брайана тоже намекает. Буду рад любой / все отзывы!

https://github.com/tivix/django-cron

Поставляется с одной командой управления:

./manage.py runcrons

Это делает работу. Каждый крон моделируется как класс (так что все его ОО), и каждый крон работает с разной частотой, и мы гарантируем, что один и тот же тип крона не работает параллельно (в случае, если самим кронам требуется больше времени, чем их частоте!) 1009 *

Спасибо!

36 голосов
/ 21 февраля 2009

Если вы используете стандартную ОС POSIX, вы используете cron .

Если вы используете Windows, вы используете в .

Написать команду управления Django в

  1. Выясните, на какой платформе они находятся.

  2. Либо выполните соответствующую команду «AT» для своих пользователей, или обновите crontab для своих пользователей.

22 голосов
/ 07 марта 2009

Интересное новое сменное приложение Django: Джанго-хронограф

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

14 голосов
/ 21 февраля 2009

Посмотрите на Cron Django Poor Man's, который является приложением Django, которое использует спам-ботов, роботов индексации поисковых систем и т. П. Для запуска запланированных задач примерно через регулярные интервалы

См .: http://code.google.com/p/django-poormanscron/

9 голосов
/ 03 апреля 2012

RabbitMQ и Celery имеют больше возможностей и возможностей для обработки задач, чем Cron. Если сбой задачи не является проблемой, и вы думаете, что будете обрабатывать неработающие задачи при следующем вызове, то Cron достаточно.

Celery & AMQP позволит вам справиться с разбитой задачей и снова будет выполняться другим работником (сотрудники Celery ожидают выполнения следующей задачи), пока атрибут задачи max_retries не станет достиг. Вы даже можете вызывать задачи при сбое, например, регистрировать сбой или отправлять электронное письмо администратору после достижения max_retries.

И вы можете распространять серверы Celery и AMQP, когда вам нужно масштабировать приложение.

9 голосов
/ 20 декабря 2011

Предложение Брайана Нила о запуске команд управления через cron работает хорошо, но если вы ищете что-то более надежное (но не такое сложное, как Celery), я бы заглянул в такую ​​библиотеку, как Kronos :

# app/cron.py

import kronos

@kronos.register('0 * * * *')
def task():
    pass
8 голосов
/ 22 февраля 2009

Я лично использую cron, но Планирование заданий частей django-extensions выглядит интересно.

7 голосов
/ 22 июня 2017

Некоторое время назад у меня было точно такое же требование, и я решил его с помощью APScheduler ( Руководство пользователя )

Это упрощает планирование заданий и делает его независимым от выполнения некоторого кода на основе запросов. Ниже приведен простой пример, который я использовал в своем коде.

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()
job = None

def tick():
    print('One tick!')\

def start_job():
    global job
    job = scheduler.add_job(tick, 'interval', seconds=3600)
    try:
        scheduler.start()
    except:
        pass

Надеюсь, это кому-нибудь поможет!

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