Версия: | 2.7.0 |
---|---|
Интернет: | http://django-celery-beat.readthedocs.io/ |
Скачать: | http://pypi.python.org/pypi/django-celery-beat |
Источник: | http://github.com/celery/django-celery-beat |
Ключевые слова: | Джанго, сельдерей, ритм, периодическая задача, cron, планирование |
Это расширение позволяет хранить расписание периодических задач в базе данных.
Периодическими задачами можно управлять из интерфейса администратора Django, где вы можете создавать, редактировать и удалять периодические задачи, а также указывать частоту их запуска.
Инструкции по использованию и установке этого расширения доступны в документации Celery.
Предупреждение
Если вы измените настройку Django TIME_ZONE
, ваше расписание периодических задач по-прежнему будет основываться на старом часовом поясе.
Чтобы это исправить, вам придется сбросить «время последнего выполнения» для каждой периодической задачи:
>> > from django_celery_beat . models import PeriodicTask , PeriodicTasks
>> > PeriodicTask . objects . all (). update ( last_run_at = None )
>> > PeriodicTasks . update_changed ()
Примечание
Это приведет к сбросу состояния, как если бы периодические задачи никогда раньше не запускались.
django_celery_beat.models.PeriodicTask
Эта модель определяет одну периодическую задачу, которую необходимо запустить.
Оно должно быть связано с расписанием, которое определяет, как часто должна выполняться задача.
django_celery_beat.models.IntervalSchedule
Расписание, которое запускается через определенный интервал (например, каждые 5 секунд).
django_celery_beat.models.CrontabSchedule
Расписание с полями типа записей в cron: minute hour day-of-week day_of_month month_of_year
.
django_celery_beat.models.PeriodicTasks
Эта модель используется только в качестве индекса для отслеживания изменений расписания.
Всякий раз, когда вы обновляете PeriodicTask
счетчик в этой таблице также увеличивается, что сообщает службе celery beat
о необходимости перезагрузить расписание из базы данных.
Если вы обновляете периодические задачи массово, вам нужно будет обновить счетчик вручную:
>> > from django_celery_beat . models import PeriodicTasks
>> > PeriodicTasks . update_changed ()
Чтобы создать периодическую задачу, выполняемую через определенный интервал, необходимо сначала создать объект интервала:
>> > from django_celery_beat . models import PeriodicTask , IntervalSchedule
# executes every 10 seconds.
>> > schedule , created = IntervalSchedule . objects . get_or_create (
... every = 10 ,
... period = IntervalSchedule . SECONDS ,
... )
Это все поля, которые вам нужны: тип периода и частота.
Вы можете выбрать определенный набор периодов:
IntervalSchedule.DAYS
IntervalSchedule.HOURS
IntervalSchedule.MINUTES
IntervalSchedule.SECONDS
IntervalSchedule.MICROSECONDS
Примечание
Если у вас есть несколько периодических задач, выполняемых каждые 10 секунд, все они должны указывать на один и тот же объект расписания.
Также доступен «кортеж вариантов», если вам нужно представить его пользователю:
>> > IntervalSchedule . PERIOD_CHOICES
Теперь, когда мы определили объект расписания, мы можем создать запись периодической задачи:
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... )
Обратите внимание, что это очень простой пример. Вы также можете указать аргументы и ключевые слова, используемые для выполнения задачи, queue
для ее отправки в [*] и установить срок действия.
Вот пример с указанием аргументов. Обратите внимание, что требуется сериализация JSON:
>> > import json
>> > from datetime import datetime , timedelta
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... args = json . dumps ([ 'arg1' , 'arg2' ]),
... kwargs = json . dumps ({
... 'be_careful' : True ,
... }),
... expires = datetime . utcnow () + timedelta ( seconds = 30 )
... )
[*] | вы также можете использовать низкоуровневую маршрутизацию AMQP, используя поля exchange и routing_key . |
Расписание crontab имеет поля: minute
, hour
, day_of_week
, day_of_month
и month_of_year
, поэтому, если вам нужен эквивалент записи crontab 30 * * * *
(выполнять через 30 минут после каждого часа), вы указываете:
>> > from django_celery_beat . models import CrontabSchedule , PeriodicTask
>> > schedule , _ = CrontabSchedule . objects . get_or_create (
... minute = '30' ,
... hour = '*' ,
... day_of_week = '*' ,
... day_of_month = '*' ,
... month_of_year = '*' ,
... timezone = zoneinfo . ZoneInfo ( 'Canada/Pacific' )
... )
Расписание crontab привязано к определенному часовому поясу с помощью входного параметра timezone.
Затем, чтобы создать периодическую задачу с использованием этого расписания, используйте тот же подход, что и для периодической задачи на основе интервалов ранее в этом документе, но вместо interval=schedule
укажите crontab=schedule
:
>> > PeriodicTask . objects . create (
... crontab = schedule ,
... name = 'Importing contacts' ,
... task = 'proj.tasks.import_contacts' ,
... )
Вы можете использовать флаг enabled
, чтобы временно отключить периодическую задачу:
>> > periodic_task . enabled = False
>> > periodic_task . save ()
Периодическим задачам по-прежнему нужны «работники» для их выполнения. Поэтому убедитесь, что установлен пакет Celery по умолчанию. (Если он не установлен, следуйте инструкциям по установке здесь: https://github.com/celery/celery)
И рабочий, и битовый сервисы должны работать одновременно.
Запустите рабочую службу Celery (укажите имя вашего проекта Django):
$ celery -A [имя-проекта] рабочий --loglevel=info
В качестве отдельного процесса запустите службу Beat (укажите планировщик Django):
$ celery -A [имя-проекта] beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
ИЛИ вы можете использовать -S (флаг планировщика), дополнительные параметры см. в разделе celery beat --help
):
$ celery -A [имя-проекта] beat -l info -S django
Кроме того, в качестве альтернативы вы можете выполнить два описанных выше шага (рабочий и битовый сервисы) с помощью только одной команды (рекомендуется только для среды разработки ):
$ celery -A [имя-проекта] рабочий --beat --scheduler django --loglevel=info
Теперь вы можете добавлять периодические задачи и управлять ими из интерфейса администратора Django.
Вы можете установить django-celery-beat либо через индекс пакетов Python (PyPI), либо из исходного кода.
Для установки с помощью pip
:
$ pip install --upgrade django-celery-beat
Загрузите последнюю версию django-celery-beat с http://pypi.python.org/pypi/django-celery-beat.
Вы можете установить его, выполнив следующие действия:
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install --upgrade build pip
$ tar xvfz django-celery-beat-0.0.0.tar.gz
$ cd django-celery-beat-0.0.0
$ python -m build
$ pip install --upgrade .
После установки добавьте django_celery_beat
в модуль настроек Django:
INSTALLED_APPS = [
...,
'django_celery_beat' ,
]
Запустите миграцию django_celery_beat
, используя:
$ python manage.py migrate django_celery_beat
Вы можете установить последнюю основную версию django-celery-beat, используя следующую команду pip:
$ pip install git+https://github.com/celery/django-celery-beat#egg=django-celery-beat
Чтобы запустить локальную разрабатываемую копию django-celery-beat с администратором Django по адресу http://127.0.0.1:58000/admin/, выполните:
$ docker-compose up --build
Войдите в систему как пользователь admin
с паролем admin
.
Если у вас есть проект, который не привязан к часовому поясу, вы можете установить DJANGO_CELERY_BEAT_TZ_AWARE=False
в файле настроек.
Разработчики django-celery-beat и тысяч других пакетов сотрудничают с Tidelift, чтобы обеспечить коммерческую поддержку и обслуживание зависимостей с открытым исходным кодом, которые вы используете для создания своих приложений. Экономьте время, снижайте риски и улучшайте работоспособность кода, платя при этом специалистам по сопровождению именно тех зависимостей, которые вы используете. Узнать больше.