Как запустить воркер Celery для выполнения фоновых задач?

Ответ

Запуск Celery требует как минимум трех компонентов: приложения с задачами, брокера сообщений (например, Redis или RabbitMQ) и самого воркера, который будет выполнять задачи.

1. Установка зависимостей

Установите Celery и клиент для брокера (в данном примере Redis).

pip install celery redis

2. Определение задач

Создайте файл tasks.py, где будет настроено приложение Celery и определены фоновые задачи.

# tasks.py
from celery import Celery
import time

# Инициализация Celery с указанием имени приложения и URL брокера
app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def add(x, y):
    time.sleep(5) # Имитация долгой операции
    return x + y

3. Запуск воркера

Откройте терминал и запустите воркер. Он подключится к брокеру и будет ожидать поступления задач.

celery -A tasks worker --loglevel=info
  • -A tasks: Указывает на модуль (tasks.py), где находится экземпляр Celery (app).
  • worker: Команда для запуска воркера.
  • --loglevel=info: Устанавливает уровень логирования для отладки.

4. Вызов задачи из основного кода

Теперь в вашем основном приложении (например, в Django или FastAPI) вы можете асинхронно вызывать задачу с помощью метода .delay().

from tasks import add

# Задача не блокирует основной поток, а отправляется в очередь брокера
result = add.delay(4, 4)

print(f"Task sent! ID: {result.id}")

Воркер получит задачу из очереди и выполнит ее в фоновом режиме.

Для периодических задач (Celery Beat): Если вам нужно запускать задачи по расписанию, дополнительно запускается планировщик beat: celery -A tasks beat --loglevel=info

Ответ 18+ 🔞

Так, слушай, а вот эта вся хуйня с Celery, она же, блядь, как трёхголовый дракон, ёпта! Чтобы его запустить, тебе нужно три штуки, и все они должны друг друга не сожрать.

1. Ставим всё, что надо

Сначала, понятное дело, качаем сам Celery и брокера. Возьмём для простоты Redis, он как шустрый гопник в подворотне — быстро передаёт сообщения.

pip install celery redis

Всё, теперь у тебя есть инструменты, а мозгов, блядь, ещё нет.

2. Пишем задачи, которые будут выполняться

Создаёшь файлик tasks.py. Тут ты, сука, объявляешь, что за хуйню ты хочешь делать в фоне.

# tasks.py
from celery import Celery
import time

# Вот это — сердце системы. Говорим: "Слушай, чувак, брокер твой сидит на редисе по такому-то адресу".
app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def add(x, y):
    time.sleep(5) # Представь, что это какая-то тяжёлая операция, типа считать зарплату за год
    return x + y

Вот, задача add теперь не просто функция, а, блядь, поручение для раба-воркера.

3. Запускаем самого воркера

Открываешь терминал и пишешь магическую команду. Это как крикнуть в пустоту: "Эй, работяги, есть работа!"

celery -A tasks worker --loglevel=info
  • -A tasks — это ты показываешь пальцем на файл tasks.py, где твоё приложение живёт.
  • worker — команда "начинай пахать, сука".
  • --loglevel=info — чтобы он не молчал как партизан, а рассказывал, что делает. Иначе потом будешь гадать, почему всё сломалось, а он тебе ни слова.

4. Кидаем задачу из основного кода

А теперь самое интересное. В своём основном приложении (допустим, каком-нибудь веб-сервере) ты не ждёшь 5 секунд, а просто швыряешь задачу в очередь и идёшь дальше, как будто так и надо.

from tasks import add

# Метод .delay() — это как крикнуть через окно: "Сделай это, когда сможешь!"
result = add.delay(4, 4)

print(f"Task sent! ID: {result.id}")

Воркер её подхватит, сделает, а ты уже можешь пользователю ответ отдавать. Красота, блядь!

А если по расписанию? (Celery Beat)

А, хочешь, чтобы задачи сами запускались, как по будильнику? Тогда, сука, нужен ещё один демон — планировщик. celery -A tasks beat --loglevel=info Запускаешь эту строку, и он будет, как пунктуальный немец, в нужное время пинать воркеров на работу. Главное — не перепутай, а то получится ебушки-воробушки, и всё полетит к чёртовой матери.