How to Use Celery in Django
Вы, наверное, заметили, что некоторые задачи в вашем приложении Django занимают много времени. Например, отправка электронных писем с подтверждением, изменение размера изображений или обработка больших файлов данных замедляют работу.
Хорошие новости? Вам не нужно сидеть и ждать. Вы можете передать эти задачи кому-то другому, и пусть ваше приложение продолжает делать свое дело. Это "что-то еще" и есть Celery.
Celery позволяет выполнять трудоемкие задачи в фоновом режиме, при этом ваше приложение работает быстро. А если вы используете Django, то подключить его на самом деле не так уж и сложно – как только вы поймете, как все это работает вместе.
В этом руководстве я расскажу вам о том, что такое Celery, почему он полезен и как именно его настроить в Django, шаг за шагом.
Оглавление
-
Что такое Celery и почему Вы должны использовать Его в Django?
-
Необязательно: Использование Django Admin для мониторинга задач
Что такое Celery и почему его следует использовать в Django?
Представьте, что вы управляете интернет-магазином. Кто-то размещает заказ. Вы хотите:
-
Сохраните заказ в базе данных
-
Отправьте им счет-фактуру по электронной почте
-
Уведомите свой склад
-
Может быть, даже начать печатать этикетку для доставки
Если ваше приложение попытается выполнить все это одновременно, ваш пользователь застрянет, уставившись на экран загрузки. Что, если вместо этого вы сразу сохраните только заказ, а остальное передадите Celery для обработки в фоновом режиме?
Это именно то, что делает сельдерей.
Это очередь задач, которая просто означает, что она запускается позже, поэтому вашему основному приложению не нужно ждать. Это особенно полезно для:
-
Отправка электронных писем
-
Импорт/экспорт данных
-
Запуск моделей машинного обучения
-
Очистка данных
-
Создание отчетов
И да, это действительно хорошо работает с Django.
Как работает сельдерей (простая версия)
Сельдерей состоит из нескольких частей:
-
Создатель задачи (ваше приложение Django) – Здесь вы вызываете задачу.
-
Брокер (обычно Redis) – это посредник. Он принимает задание и удерживает его до тех пор, пока работник не сможет его выполнить.
-
Worker – Это фоновый процесс Celery, который получает задачи от брокера и выполняет их.
Вот последовательность действий:
Django app → Redis → Celery Worker → Done ✅
Теперь давайте на самом деле настроим это.
Как использовать Celery в Django
1. Установите нужные пакеты
Вам понадобится celery и посредник обмена сообщениями. Redis - популярный вариант.
pip install celery redis
Также убедитесь, что у вас запущен Redis. Вы можете установить его локально через Homebrew (brew install redis) или использовать контейнер Docker.
Если вы используете Docker:
docker run -p 6379:6379 redis
2. Создайте файл celery.py в папке вашего проекта
Допустим, ваш проект на Django называется myproject. Внутри той же папки (где находится settings.py) создайте файл с именем celery.py.
# myproject/celery.py
import os
from celery import Celery
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
app = Celery("myproject")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
Вот что происходит:
-
os.environ...устанавливает настройки Django. -
Celery("myproject")создает новое приложение Celery с названием вашего проекта. -
app.config_from_object(...)указывает Celery прочитать конфигурацию из файла настроек Django. -
autodiscover_tasks()указывает Celery автоматически находить задачи в ваших приложениях Django.
3. Добавьте сельдерей в __init__.py
Все еще находясь в папке myproject/, откройте __init__.py и добавьте:
from .celery import app as celery_app
__all__ = ("celery_app",)
Это гарантирует, что Celery начинается с Django.
4. Укажите URL-адрес брокера в своих настройках
Откройте settings.py и добавьте:
CELERY_BROKER_URL = 'redis://localhost:6379/0'
Это указывает Celery использовать Redis в качестве посредника.
5. Напишите свое первое задание
Перейдите в одно из ваших приложений Django (допустим, у вас есть приложение с именем shop) и создайте файл с именем tasks.py.
# shop/tasks.py
from celery import shared_task
@shared_task
def send_invoice_email(order_id):
# Imagine this sends an email
print(f"Sending invoice email for order {order_id}")
Декоратор @shared_task сообщает Celery, что это фоновая задача.
6. Вызовите задачу из ваших представлений
Вот как бы вы использовали это в представлении Django:
# shop/views.py
from .tasks import send_invoice_email
from django.shortcuts import render
def place_order(request):
# pretend this saves an order
order_id = 1234 # this would come from your model
# run the task in the background
send_invoice_email.delay(order_id)
return render(request, "order_complete.html")
Обратите внимание на .delay() – это то, что отправляет задачу в Celery.
7. Запустите программу Celery worker
Теперь откройте терминал и запустите worker:
celery -A myproject worker --loglevel=info
Вы должны увидеть, как работник начинает выполнять задания и ожидает их выполнения. Когда вы разместите заказ, он напечатает что-то вроде:
Sending invoice email for order 1234
Необязательно: использование Django Admin для мониторинга задач
Если вы хотите отслеживать статус задачи в админке, вы можете использовать django-celery-results.
pip install django-celery-results
Затем обновите свой settings.py:
INSTALLED_APPS += ["django_celery_results"]
CELERY_RESULT_BACKEND = "django-db"
Запустите миграцию:
python manage.py migrate
Теперь Celery сохранит результаты задания в вашей базе данных, и вы сможете просмотреть их в Django admin.
Часто задаваемые вопросы
Что произойдет, если Redis выйдет из строя?
Ваши задания не будут отправлены или приняты. Но как только Redis вернется, все должно возобновиться.
Могу ли я повторить неудачные задания?
Да! Celery поддерживает повторные попытки. Вы можете указать, сколько раз и как часто должна выполняться задача. Пример:
@shared_task(bind=True, max_retries=3)
def risky_task(self):
try:
# Do something risky
pass
except Exception as e:
raise self.retry(exc=e, countdown=60)
Является ли сельдерей единственным вариантом?
Нет. Есть также Django Q, Dramatiq и Huey. Но Celery - самый зрелый из них, и у него самое большое сообщество.
Завершаем
Использование Celery в Django не только ускоряет работу, но и помогает улучшить работу ваших пользователей.
Разгрузка от тяжелых или медленных задач делает ваше приложение более быстрым и надежным.
Как только вы освоите основы, вы обнаружите, что можете использовать его для самых разных целей.