Wiki · Технологии разработки
Celery
Содержание 5 разделов
Celery – это очередь фоновых задач для Python: приложение кладёт задание в брокер сообщений, а отдельные процессы-воркеры забирают его и выполняют вне запроса пользователя. Проект открытый, распространяется по лицензии BSD, на октябрь 2026 года стабильная ветка 5.6.
Если перевести на язык заказчика, Celery отвечает за всё, что сайт делает «потом»: отправить письмо после заказа, собрать отчёт за квартал, сжать загруженные фотографии, выгрузить заказы в 1С. Пользователь нажал кнопку и сразу получил ответ, а работа идёт в фоне.
Что случится, если обходиться без очереди
Условный пример. Менеджер нажимает «Выгрузить заказы за год в Excel». Без очереди сервер собирает файл прямо в ответ на этот клик: страница крутится минуту, потом две, а потом веб-сервер обрывает запрос по таймауту, и менеджер видит ошибку 504 вместо файла. Он жмёт ещё раз, и теперь сервер собирает два одинаковых отчёта сразу.
С рассылкой хуже. Если отправлять 20 000 писем в том же процессе, который отвечает посетителям, сайт тормозит у всех, пока идёт отправка. А если процесс упадёт на середине, никто не узнает, кому письмо ушло, а кому нет.
С Celery сайт за доли секунды ставит задачу в очередь и отвечает: «Отчёт готовится, пришлём ссылку на почту». Воркер собирает файл столько, сколько нужно, и никого не задерживает.

Из чего состоит схема с Celery
- Приложение: сайт на Django, Flask или FastAPI, которое создаёт задачу.
- Брокер: хранит задачи, пока их не заберут. Сам Celery этим не занимается.
- Воркеры: процессы, которые выполняют задачи. Их можно запустить несколько, в том числе на разных серверах.
- Хранилище результатов: если приложению нужно знать, чем закончилась задача.
- Celery beat: планировщик, который ставит задачи по расписанию, например каждую ночь в 3:00.
В коде это выглядит так:
@app.task
def send_invoice(order_id):
... # собрать счёт и отправить письмо
send_invoice.delay(order_id) # поставить в очередь
RabbitMQ или Redis в роли брокера
Документация Celery называет полностью поддержанными два брокера: RabbitMQ и Redis. Другие брокеры, например Amazon SQS, тоже подключаются, но поддерживают не все возможности Celery.
| Брокер | Когда выбирают |
|---|---|
| Redis | Redis уже стоит в проекте как кэш, задач немного, проще поддерживать один сервис |
| RabbitMQ | Задач много, важна гарантированная доставка, через тот же брокер обмениваются сообщениями другие системы |
Поднимают всё это обычно в Docker: приложение, брокер и воркеры в отдельных контейнерах.
Что проверить в проекте, где есть Celery

- Повторы при сбое. Внешний сервис может не ответить, и задачу нужно повторить с паузой. В Celery для этого есть автоматические повторы с растущим интервалом, но их надо включить для каждой задачи.
- Двойное выполнение. При некоторых настройках, если воркер упал посреди работы, задача выполнится заново. Документация советует писать задачи так, чтобы повтор был безвреден: письмо не уходит второй раз, счёт не выставляется дважды.
- Ограничение по времени. Задача, которая зависла на запросе к внешнему API, держит воркер. Нужны таймауты на запросы и лимиты времени на сами задачи.
- Мониторинг. Flower показывает в браузере воркеры и задачи в реальном времени, а команды celery inspect отвечают, что сейчас выполняется и что ждёт. Кто-то должен получать сигнал, если очередь растёт, а воркеры стоят.
Ещё одна деталь: Celery не поддерживает Windows. Если разработчик собирается запускать воркеры на Windows-сервере, это повод задать вопросы до старта.
Celery вместо cron, слежение за задачами и повторные запуски
Чем Celery отличается от cron?
Cron запускает скрипт по расписанию и не знает, чем он закончился, а Celery принимает задачи от сайта в любой момент, раздаёт их воркерам, повторяет при сбое и показывает статус. Для задач по расписанию в Celery есть свой планировщик beat, поэтому cron в таком проекте часто не нужен вовсе.
Как следить, что задачи Celery выполняются?
Проще всего поставить Flower: это веб-интерфейс, где видно воркеры, очередь и ошибки задач. Плюс алерт на длину очереди в брокере.
Почему задача Celery выполнилась дважды?
Задача Celery выполняется повторно, когда сообщение не успело получить подтверждение: воркер упал или перезапустился в процессе, и брокер отдал задачу снова. Так бывает при настройке подтверждения после выполнения. Защита в самом коде: перед отправкой письма или выставлением счёта задача проверяет, не сделано ли это уже.
Если долгие операции на сайте тормозят страницы или обрываются по таймауту, поможет доработка существующего сайта: вынесем рассылки, выгрузки и обработку файлов в фон и настроим наблюдение за очередью в технической поддержке.
Источники
- Celery: официальная документация, разделы Introduction to Celery, Tasks и Monitoring and Management Guide
- Репозиторий celery/celery на GitHub и лицензия BSD
См. также: Redis, Apache Kafka, Коды ответов сервера.
Остались вопросы по теме «Celery»?
Напишите нам в Telegram или MAX. Ответит специалист, который отвечает за эту тему, или руководитель проектов в рабочее время.
Отвечает по темеСергей ЧерняковWeb-разработчикНад статьёй работали
Услуги
Услуги по теме
Посчитайте стоимость проекта за 2 минуты
Калькулятор соберёт смету по нашим тарифам: сайт, дизайн, интеграции и поддержка.
