
При создании некоторых web-приложений порой требуется выполнять задачи асинхронно запросу пользователя или периодически.
К первым можно, например, отнести отправку уведомлений по электронной почте. В этом случае невозможно гарантировать быструю обработку запроса. Поэтому отправку уведомления можно поместить в параллельный поток и запрос не будет зависеть от скорости этой самой отправки.
Ко вторым относятся задачи, обычно размещаемые в cron
.
И здесь на помощь как раз может придти система типа Celery — асинхронная очередь задач, основанная на передаче сообщений. Надо сказать, что Celery можно и нужно использовать не только в web-приложениях. Но здесь я расскажу о ней применительно к популярному web-фреймверку Django. Еще стоит оговориться, что я раскрою лишь малую часть системы Celery (достаточную для использования в Django), потому как её возможности достаточно велики.
Для работы Celery необходимо выбрать брокер — систему, которая будет заниматься очередью сообщений — хранением и выборкой. Celery поддерживает множество брокеров. Среди которых есть и Redis. Именно Redis и RabbitMQ заявлены как стабильные для Celery. Redis — очень популярная система управления структурами данных на основе key-value. Будем считать, что Redis установлен и настроен.
Установка самого Celery совершенно не вызывает никаких проблем и описана в руководстве. После установки Celery уже можно использовать. В том числе и для Django. Но управление задачами будет не столь удобно, как с использованием пакета django-celery для фреймверка. Этот пакет позволит использовать админку Джанги для управления периодическими задачами, автоопределение задач из модулей фреймверка. Есть и другие пока не интересные для нас фичи.
Итак, после установки этих двух пакетов — давайте настроим их. Вообще, Celery можно настроить тысячей разных способов. Я покажу лишь один из вариантов. Вы можете выбрать свой. В файле settings.py
вашего django-проекта добавьте следующее:
Основные установки для интеграции Django и Celery заданы. Теперь создадим приложение Celery (в файле celery.py рядом с settings.py) почти как описано в документации:
Всё. Можно создать задачи и запускать manage.py celeryd
* и manage.py celerybeat
для тестирования интеграции. Но мы пойдем немного дальше и я покажу как запустить celery демоном в Ubuntu для service
. Создайте /etc/init.d/celeryd
и запишите в него код отсюда. Затем в /etc/default/celeryd впишите следующее:
Это все премудрости простого способа развернуть Celery, интегрированную с Django. Теперь достаточно выполнить
и читать логи celery — они подскажут, если что-то пошло не так.
Теперь рассмотрим практическое применение celery в django-проекте.
Для создания асинхронной задачи в любом django-приложении создайте файл tasks.py:
Теперь в админке /admin/djcelery/periodictask/add/
можно добавить эту задачу для выполнения с любой периодичностью, ограниченной лишь celerybeat.
Если же нужно создать асинхронную задачу, то можно определить любую функцию или метод как:
а затем вызвать её где-то в приложении, например так:
Замечу, что процессы описаны для Django 1.5-1.7, Celery 3.1.13, django-celery 3.1.10. Если у вас будут другие версии пакетов, то что-то может не заработать. Документация — в помощь.
Полезные ссылки:
- Периодичные задачи и параметры периодичности
- Настройка демона
- Использование django-celery
- Использование Celery в Django
- Интеграция с фреймверками
- Практические задачи
UPDATE: Метод manage.py celeryd
объявлен устаревшим, поэтому вместо него следует использовать manage.py celery worker
2 комментария:
Спасибо за статью, в частности, за способ запуска celery как демона в Ubuntu.
Как можно решить вопрос graceful restart'а демона при очередном релизе django-проекта?
Антон, рискну предположить, что если Celery очень часто вызывает асинхронные задачи из запросов и потеря данных критична или продолжительность выполнения задач большая, то это тема отдельного поста. Я же в этот вопрос пока не погружался. В документации и инетах пока на него не натыкался.
Отправить комментарий