SKILL.md
Backend async tasks (Celery)
When to use
- You are adding or changing a Celery task in
backend/src/backend/apps/**/tasks.py. - You need to update the Celery Beat schedule in
backend/src/backend/celery_app.py. - You are adding DB access inside a Celery worker process.
Steps
- Define tasks only in a
tasks.pyfile under the relevant app module. - Decorate tasks with
@app.taskimported frombackend.celery_app. - Return a typed result (
int,None, etc.). Keep task-specific parameters
local unless they must be environment-configured.
- For DB access:
- Use asyncio.run() to bridge async work. - Always acquire a session via gettasksession() from backend.celery_app.
- For periodic jobs, update
app.conf.beat_schedulein
backend/src/backend/celery_app.py and use celery.schedules.crontab.
Constraints and guardrails
- Never use the global
alchemy_configengine inside a task; it is not fork-safe
for Celery workers.
- Always use
gettasksession()to manage DB connections safely across worker
processes.
References
backend/src/backend/apps/**/tasks.pybackend/src/backend/celery_app.pybackend/tests/apps/users/test_tasks.py