Background jobs per Python
Le applicazioni web producono operazioni lente che non vanno eseguite nel request/response ciclo: invio email, generazione report, batch processing, chiamate API esterne con timeout. Il pattern standard: task queue — l’applicazione inserisce un task in coda, un worker separato lo esegue asincronamente.
Celery, creato da Ask Solem Hoel (Norvegia) nel 2009, è la task queue distribuita standard di Python. La versione 3.0 (luglio 2012) consolida la maturità produttiva. Licenza BSD.
Architettura
[Django/Flask app] → [Broker (RabbitMQ/Redis)] → [Celery workers]
↓
[Result backend]
- Broker — message queue esterna (RabbitMQ il più solido, Redis il più usato, SQS per AWS)
- Workers — processi Python che consumano task
- Result backend — opzionale, store per risultati task (Redis, PostgreSQL, Cassandra)
- Beat — scheduler per task periodici
Definizione di task
from celery import Celery
app = Celery('myapp', broker='redis://localhost:6379/0')
@app.task
def send_email(to, subject, body):
# ... invio SMTP ...
return True
# Uso
send_email.delay('user@example.com', 'Welcome', 'Hi there')
# oppure async con parametri
result = send_email.apply_async(args=['...'], countdown=60, retry=True)
Canvas (workflow primitives)
Celery fornisce primitive di workflow:
- chain(task1, task2, task3) — sequenziale
- group(task1, task2, task3) — parallelo
- chord(group, callback) — parallelo + callback su completamento
- chunks, map, starmap
Consente orchestrazione complessa senza workflow engine separato.
Uso pratico
- Email/notification dispatch
- Report/export generation
- ETL/data processing
- Media transcoding
- ML inference batch
- Periodic scheduled tasks (cron-like con Celery Beat)
Alternative
- RQ (Redis Queue) — più semplice, solo Redis
- Dramatiq — alternativa moderna con API simile
- Huey — leggero
- TaskIQ — asyncio-native
- Apache Airflow — orchestration heavy-duty (DAG)
Nel contesto italiano
Celery è nel backend di quasi ogni applicazione Python aziendale italiana non-trivial — e-commerce, portali PA, SaaS.
Riferimenti: Celery 3.0 (luglio 2012). Ask Solem Hoel. Licenza BSD. Broker: RabbitMQ, Redis, SQS. Canvas primitives: chain, group, chord. Celery Beat scheduler.
