Первые шаги в работе с Django¶
Использование Celery с Django¶
Примечание
Предыдущие версии Celery требовали отдельной библиотеки для работы с Django, но начиная с версии 3.1 это больше не так. Теперь Django поддерживается из коробки, поэтому этот документ содержит только базовый способ интеграции Celery и Django. Вы будете использовать тот же API, что и пользователи не-Django, поэтому рекомендуем вам сначала прочитать учебник Первые шаги с сельдереем и вернуться к этому учебнику. Когда у вас будет рабочий пример, вы сможете перейти к руководству Следующие шаги.
Примечание
Celery 5.0.x поддерживает Django 1.11 LTS или более новые версии. Пожалуйста, используйте Celery 4.4.x для версий старше Django 1.11.
Чтобы использовать Celery в вашем проекте Django, вы должны сначала определить экземпляр библиотеки Celery (называемый «app»)
Если у вас есть современный макет проекта Django, например:
- proj/
- manage.py
- proj/
- __init__.py
- settings.py
- urls.py
то рекомендуемый способ - создать новый модуль proj/proj/celery.py, определяющий экземпляр Celery:
- файл:
proj/proj/celery.py
Затем вам нужно импортировать это приложение в ваш модуль proj/proj/__init__.py
. Это гарантирует, что приложение будет загружено при запуске Django, чтобы декоратор @shared_task
(о котором будет сказано позже) использовал его:
proj/proj/__init__.py
:
Обратите внимание, что этот пример компоновки проекта подходит для больших проектов, для простых проектов вы можете использовать один содержащийся модуль, определяющий и приложение, и задачи, как в учебнике Первые шаги с сельдереем.
Давайте разберем, что происходит в первом модуле, во-первых, мы устанавливаем переменную окружения по умолчанию DJANGO_SETTINGS_MODULE
для программы командной строки celery:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
Эта строка не нужна, но она избавляет вас от необходимости постоянно передавать модуль настроек в программу celery
. Он должен быть всегда перед созданием экземпляров приложения, что мы и делаем далее:
app = Celery('proj')
Это наш экземпляр библиотеки, у вас может быть много экземпляров, но при использовании Django для этого, вероятно, нет причин.
Мы также добавили модуль настроек Django в качестве источника конфигурации для Celery. Это означает, что вам не нужно использовать несколько конфигурационных файлов, а вместо этого конфигурировать Celery непосредственно из настроек Django; но вы также можете разделить их, если хотите.
app.config_from_object('django.conf:settings', namespace='CELERY')
Прописное имя означает, что все Celery configuration options должны быть указаны в верхнем регистре, а не в нижнем, и начинаться с CELERY_
, поэтому, например, параметр task_always_eager
становится CELERY_TASK_ALWAYS_EAGER
, а параметр broker_url
становится CELERY_BROKER_URL
. Это относится и к рабочим параметрам, например, параметр worker_concurrency
становится CELERY_WORKER_CONCURRENCY
.
Например, конфигурационный файл проекта Django может включать:
...
# Celery Configuration Options
CELERY_TIMEZONE = "Australia/Tasmania"
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60
Вы можете передать объект настроек напрямую, но лучше использовать строку, так как в этом случае рабочий не должен сериализовать объект. Пространство имен CELERY_
также необязательно, но рекомендуется (для предотвращения дублирования с другими настройками Django).
Далее, обычной практикой для многократно используемых приложений является определение всех задач в отдельном модуле tasks.py
, и у Celery есть способ автоматического обнаружения таких модулей:
app.autodiscover_tasks()
С помощью приведенной выше строки Celery будет автоматически обнаруживать задачи из всех установленных приложений, следуя соглашению tasks.py
:
- app1/
- tasks.py
- models.py
- app2/
- tasks.py
- models.py
Таким образом, вам не придется вручную добавлять отдельные модули к настройке CELERY_IMPORTS
.
Наконец, пример debug_task
- это задача, которая сбрасывает информацию о своем собственном запросе. Здесь используется новая опция задачи bind=True
, представленная в Celery 3.1, чтобы легко ссылаться на текущий экземпляр задачи.
Расширения¶
django-celery-results
- Использование Django ORM/Cache в качестве бэкенда результатов¶
Расширение django-celery-results предоставляет бэкенды результатов, использующие либо Django ORM, либо Django Cache framework.
Чтобы использовать это в своем проекте, необходимо выполнить следующие шаги:
Установите библиотеку django-celery-results:
$ pip install django-celery-results
Добавьте
django_celery_results
кINSTALLED_APPS
вsettings.py
вашего проекта Django:INSTALLED_APPS = ( ..., 'django_celery_results', )
Обратите внимание, что в имени модуля нет тире, только подчеркивание.
Создайте таблицы базы данных Celery, выполнив миграцию базы данных:
$ python manage.py migrate django_celery_results
Настройте Celery на использование бэкенда django-celery-results.
Предполагая, что вы используете
settings.py
от Django, чтобы также настроить Celery, добавьте следующие параметры:CELERY_RESULT_BACKEND = 'django-db'
Для бэкенда кэша вы можете использовать:
CELERY_RESULT_BACKEND = 'django-cache'
Мы также можем использовать кэш, определенный в настройках CACHES в django.
# celery setting. CELERY_CACHE_BACKEND = 'default' # django setting. CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', } }
Дополнительные параметры конфигурации см. в справочнике Настройки бэкенда результатов задачи.
django-celery-beat
- Периодические задачи с поддержкой базы данных и интерфейсом администратора.¶
Дополнительную информацию см. в разделе Использование пользовательских классов планировщика.
Запуск рабочего процесса¶
В производственной среде вы захотите запускать worker в фоновом режиме как демон - см. Демонизация - но для тестирования и разработки полезно иметь возможность запускать экземпляр worker с помощью команды управления celery worker, так же как вы используете команду Django manage.py runserver:
$ celery -A proj worker -l INFO
Для получения полного списка доступных опций командной строки используйте команду help:
$ celery help
Куда двигаться дальше¶
Если вы хотите узнать больше, вам следует перейти к учебнику Next Steps, а после него вы можете изучить User Guide.