Ответ
Celery выполняет задачи асинхронно в отдельных фоновых процессах, называемых воркерами, что позволяет основному приложению (например, веб-серверу) не блокироваться на время выполнения длительных операций.
Архитектура Celery состоит из трех ключевых компонентов:
- Клиент (ваше приложение): Создает и отправляет задачу в очередь.
- Брокер сообщений (например, RabbitMQ, Redis): Принимает, хранит и передает задачи воркерам. Это центральный узел системы.
- Воркер (Worker): Отдельный процесс, который забирает задачи из очереди, выполняет их и (опционально) сохраняет результат в бэкенд.
Пример задачи:
# tasks.py
from celery import Celery
import time
# Инициализация Celery с указанием брокера
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def send_email(to, content):
print(f"Отправка письма для {to}...")
time.sleep(5) # Имитация длительной операции
print("Письмо отправлено.")
return f"Email to {to} sent successfully."
Запуск воркера из терминала:
celery -A tasks worker --loglevel=info
Вызов задачи из приложения:
from tasks import send_email
# Задача немедленно отправляется в очередь,
# а выполнение кода продолжается без ожидания.
send_email.delay("user@example.com", "Hello, World!")
Такой подход позволяет масштабировать обработку задач, запуская множество воркеров, в том числе на разных серверах, и обеспечивает надежность за счет механизмов повторных попыток.
Ответ 18+ 🔞
Вот, смотри, чтобы ты понимал, как эта штука работает, а то у некоторых в голове, прости господи, ветер свистит. Celery — это такой хитрый механизм, который делает всю чёрную работу в сторонке, пока твоё основное приложение, например, веб-сервер, не тупит и не ждёт, пока эта работа закончится. Всё это крутится в отдельных фоновых процессах, которые зовутся воркерами. Гениально, да? А то представь: пользователь нажал кнопку «отправить отчёт», а весь сервер нахуй лег и ждёт, пока этот отчёт на десять тысяч строк сгенерируется. Пиздец, а не архитектура.
Вся эта махина стоит на трёх китах, без которых она — просто пшик:
- Клиент (это твоё приложение, дурачок): Его дело — создать задачу и швырнуть её в очередь. И забыть. «Не моя больше проблема», — думает он и идёт пить чай.
- Брокер сообщений (RabbitMQ, Redis и прочая живность): Это, блядь, центральный почтамт. Принимает задачи, складирует их и тыкает ими воркеров, когда те освобождаются. Без него — нихуя не работает, всё рассыпется.
- Воркер (Worker): А вот это уже работяга, лох потный. Он торчит в фоне, как призрак, выгребает задачи из этой очереди и пашет. Выполнил — может результат куда-то сохранить, если надо. Герой, в общем, невидимый.
Вот тебе пример, как это выглядит в коде, чтобы не быть голословным:
# tasks.py
from celery import Celery
import time
# Тут мы Celery инициализируем и говорим, где наш брокер-почтальон живёт
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task # Вот этой волшебной штукой помечаем, что это задача для фона
def send_email(to, content):
print(f"Отправка письма для {to}...")
time.sleep(5) # Представь, что тут не sleep, а реальная долгая хуйня
print("Письмо отправлено.")
return f"Email to {to} sent successfully."
Чтобы эти воркеры ожили, их надо запустить в терминале. Делается это так:
celery -A tasks worker --loglevel=info
И вот они, мартышлюшки, начинают дежурить у очереди.
А теперь самое вкусное — как этим пользоваться из основного кода:
from tasks import send_email
# Видишь этот метод .delay()? Это и есть пинок под зад задаче.
# Она улетает в очередь, а твой код даже не моргнул глазом и пошёл дальше.
send_email.delay("user@example.com", "Hello, World!")
Вот и вся магия, ёпта. Такой подход позволяет накинуть кучу воркеров, хоть на разных серверах, и они будут жрать задачи как голодные псы. А если что-то пошло не так — есть механизмы повторов, надёжность, всё дела. Красота, а не жизнь. Главное — брокер не забудь поднять, а то будешь как дурак задачи в никуда кидать.