Celery — библиотека Python для выполнения задач в фоне. Приложение передаёт задачу брокеру сообщений, а отдельный процесс-исполнитель получает и выполняет её вне HTTP-запроса; Celery используют для писем, обработки файлов, уведомлений, интеграций и задач по расписанию.
Что такое Celery? Для чего используется?
Подробный ответ
Зачем нужен Celery
Некоторые операции занимают много времени: отправка письма, создание отчёта, обработка изображения, запрос к внешнему сервису или массовая рассылка. Если выполнять их прямо в HTTP-запросе, пользователь будет долго ждать ответ, а веб-приложение будет удерживать ресурсы.
Как устроена работа
Web application
|
| put task into queue
v
Message broker
|
| take task from queue
v
Celery executor
|
v
Result storage, optionalприложение ставит задачу в очередь;
брокер сообщений временно хранит и передаёт задачу;
исполнитель Celery получает задачу и выполняет её отдельно от web-приложения;
хранилище результатов необязательно и нужно только если приложению требуется узнать статус или результат задачи.
Пример задачи
from celery import shared_task
@shared_task
def send_welcome_email(user_id: int) -> None:
user = get_user(user_id)
send_email(
to=user.email,
subject='Добро пожаловать',
body='Спасибо за регистрацию',
)Постановка задачи
send_welcome_email.delay(user.id)Для чего используют
отправка email и уведомлений;
обработка загруженных файлов, изображений и видео;
генерация отчётов и экспортов;
синхронизация с внешними сервисами;
задачи по расписанию через Celery Beat.
Что важно учитывать
Задача может быть выполнена повторно после сбоя, поэтому её желательно делать идемпотентной. В задачу лучше передавать простые данные или идентификаторы, а не тяжёлые объекты. Также нужны retries с задержкой, ограничение времени выполнения и логирование ошибок.
Как ответить на собеседовании
Celery выполняет фоновые задачи вне HTTP-запроса. Приложение ставит задачу в брокер сообщений, отдельный исполнитель получает её и запускает. Я использую Celery для писем, обработки файлов, отчётов и интеграций. Задачи делаю идемпотентными, передаю в них идентификаторы, добавляю retries и контролирую время выполнения.
Оцени свой прогресс