Теперь настало время перейти к практике и научиться устанавливать и настраивать Celery в реальных проектах.
В этой лекции мы создадим базовое окружение для работы с Celery в двух популярных фреймворках: FastAPI и Django.
Пристегните ремни — будет интересно!
На случай, если вы вдруг задаётесь вопросом: "А зачем мне этот Celery?" — представьте себе ситуацию:
ваше веб-приложение должно отправить 1000 email-уведомлений. Если пытаться сделать это синхронно, сервер будет заблокирован до тех пор,
пока все письма не улетят. Результат — страдающие пользователи и обеспокоенный админ.
Celery позволяет передать эту «головную боль» фоновому процессу. Более того, он отлично справляется с распределением задач между несколькими серверами.
Красота, правда?
Установка Celery и дополнительных библиотек
Начнём с установки пакета Celery. Это настолько просто, что можно сделать одной строкой:
pip install celery
Celery нуждается в брокере сообщений. Мы будем использовать Redis — быстро, просто, удобно:
pip install redis
Если вы предпочитаете RabbitMQ (мы с ним тоже знакомились), можете использовать его — Celery умеет работать с разными брокерами. Но для начала Redis проще.
Настройка Celery в Django
Начнём с классики жанра — Django. Интеграция выглядит так:
В корневой папке проекта (где settings.py), создайте файл celery.py:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
Устанавливаем настройки по умолчанию:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings')
app = Celery('your_project_name')
Читаем конфигурацию из settings.py:
app.config_from_object('django.conf:settings', namespace='CELERY')
Автоматический поиск задач в приложениях:
app.autodiscover_tasks()
В каждом Django-приложении добавьте файл tasks.py:
from celery import shared_task
@shared_task
def add(x, y):
return x + y
В settings.py добавьте настройки Celery:
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
Запуск Celery:
celery -A your_project_name worker --loglevel=info
Настройка Celery в FastAPI
Теперь перейдём к FastAPI — модному, быстрому и асинхронному.
Шаг 1: создаем celery_app.py
celery_app.py
from celery import Celery
celery_app = Celery(
"my_fastapi_project",
broker="redis://localhost:6379/0",
backend="redis://localhost:6379/0",
)
@celery_app.task
def send_email(recipient: str, subject: str, body: str):
print(f"Отправляем письмо на {recipient} с темой '{subject}' и телом:\n{body}")
Шаг 2: вызываем задачу из FastAPI
main.py
from fastapi import FastAPI
from celery_app import send_email
app = FastAPI()
@app.post("/send/")
async def send(recipient: str, subject: str, body: str):
send_email.delay(recipient, subject, body)
return {"status": "Задача отправлена!"}
Шаг 3: запуск Celery
celery -A celery_app.celery_app worker --loglevel=info
Обратите внимание: celery_app — это имя Python-модуля (файла без .py), а .celery_app — объект внутри него.
Тестирование и отладка
Теперь, когда мы всё настроили, пришло время протестировать наши приложения.
В Django задачи можно вызывать напрямую через Django Shell:
python manage.py shell
И из консоли:
from your_app.tasks import add
add.delay(4, 6)
Если всё работает, вы увидите, что воркер Celery обработал задачу.
А теперь сделаем проверку в FastAPI.
Просто отправьте POST запрос через любой инструмент (например, Postman или curl):
curl -X 'POST' \
'http://127.0.0.1:8000/multiply/' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"x": 5,
"y": 3
}'
И наблюдайте за воркером Celery.
Типичные ошибки при настройке
- Redis не запущен.
Если ваш Redis-сервер не запущен, Celery выдаст ошибку подключения. Убедитесь, что Redis работает:redis-server - Неправильный путь модуля.
Указанный в-Aпуть модуля должен быть корректным. Если ваш проект называетсяmy_project, формат будетmy_project.celery. - Конфликт портов.
Если Redis использует другой порт, обновитеCELERY_BROKER_URLиbrokerв настройках.
Вывод
Теперь вы знаете, как подключить Celery к Django и FastAPI, не потеряв здравый смысл.
Celery берёт на себя все фоновые и тяжёлые задачи, давая вашему приложению вздохнуть свободно.
В следующих лекциях мы будем углубляться в продвинутые возможности Celery, такие как планирование задач с Celery Beat.
А пока — не бойтесь делегировать работу Celery. Он справится.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ