Давайте теперь создадим периодическую задачу. Откройте publish/celery.py и зарегистрируйте задания:
import os
from celery import Celery
from celery.schedules import crontab
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_celery.settings')
app = Celery('publish', broker_connection_retry=False,
broker_connection_retry_on_startup=True, )
app.config_from_object('django.conf:settings')
broker_connection_retry = False
app.autodiscover_tasks()
app.conf.beat_schedule = {
'send-report-every-single-minute': {
'task': 'publish.tasks.send_view_count_report',
'schedule': crontab(),
},
}
Мы создавали расписание, которое запускает задачу publisher.tasks.send_view_count_report каждую минуту, как показано в нотации crontab().
Вы также можете указать различные расписания Celery Crontab:
|
Пример |
Значение |
|
|
Выполняется каждую минуту. |
|
|
Выполняется ежедневно в полночь. |
|
|
Выполняется каждые три часа: полночь, 3 утра, 6 утра, 9 утра, полдень, 15:00, 6 вечера, 9 вечера. |
|
|
То же, что и в прошлом. |
|
|
Выполняется каждые 15 минут. |
|
|
Выполняется каждую минуту (!) по воскресеньям. |
|
|
То же, что и в прошлом. |
|
|
Выполняется каждые десять минут, но только между 3–4 часами утра, 5–6 вечера и 22–23 часами по четвергам и пятницам. |
|
|
Выполняется в каждый чётный час и в каждый час делимый на три. Это означает: каждый час, кроме: 1:00, 5:00, 7:00, 11:00, 13:00, 17:00, 19:00, 23:00 |
|
|
Выполняется в каждый час, делимый на 5. |
|
|
Выполняется в каждый час, делимый на 3, и каждый час в рабочее время (с 8:00 до 17:00). |
|
|
Выполняется во второй день каждого месяца. |
|
|
Выполняется в каждый чётный день месяца. |
|
|
Выполняется в первую и третью недели месяца. |
|
|
Выполняется одиннадцатого мая каждого года. |
|
|
Выполняется каждый день в первый месяц каждого квартала. |
Откроем еще одну консоль, активируйте соответствующее окружение и запустите службу Celery Beat:
celery -A publish beat
Работа службы Beat заключается в том, чтобы задавать задачи в Celery в соответствии с расписанием. Давайте оставим на несколько минут запущенную нашу задачу:
Проверим почту:
Мы видим что расписание выполняет задачу send_view_count_report каждую минуту в соответствии с настройкой. Это удобно для тестирования, но не рекомендуется для реального веб-приложения.
Задачи часто используются для выполнения ненадежных операций, операций, зависящих от внешних ресурсов, или задачи, которые могут легко падать по различным причинам. Вот инструкция, чтобы сделать их более надежными:
- Сделать задачи идемпотентными. Идемпотентная задача - это задача, которая, не изменяет состояние системы, если она остановлена на полпути. Задача либо полностью вносит изменения в систему, либо нет.
- Повторение задачи. Если задача падает, рекомендуется попробовать выполнять ее снова и снова, пока она не будет выполнена успешно. Вы можете сделать это с помощью Celery Retry.