Перейти к содержанию

Celery

Выносите медленную или требующую надёжности фоновую работу в очередь задач Celery.

pip install "endocore[celery]"     # плюс брокер, например Redis или RabbitMQ

Регистрация Celery-приложения

# extensions.py
from endocore.extensions import CeleryExtension

extensions = [
    CeleryExtension(
        app_name="myapp",
        broker="redis://localhost:6379/1",
        backend="redis://localhost:6379/2",
    ),
]

Это регистрирует Celery-приложение как DI-провайдер под именем celery.

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

# Services/tasks.py
from endocore.extensions import celery_app

app = celery_app("myapp", broker="redis://localhost:6379/1")

@app.task
def send_email(to: str, subject: str, body: str):
    ...

Воркер запускается как обычно:

celery -A Services.tasks:app worker --loglevel=info

Постановка в очередь из обработчика

from Services.tasks import send_email

async def handler(request):                # Api/v1/Signup/Post.py
    data = await request.json()
    send_email.delay(data["email"], "Welcome", "Thanks for signing up!")
    return Response.json({"queued": True}, status=202)

Фоновые задачи vs Celery

Задача Инструмент
Fire-and-forget работа, привязанная к одному ответу, best-effort Response background
Долговечная, с ретраями, распределённая работа Celery

Только фабрика, без расширения:

from endocore.extensions import celery_app
app = celery_app("myapp", broker="redis://localhost:6379/1")