O que python-background-jobs faz?
Padrões de jobs em segundo plano em Python, incluindo filas de tarefas, workers e arquitetura orientada a eventos. Use ao implementar processamento assíncrono de tarefas, filas de jobs, operações de longa duração ou desacoplamento do trabalho dos ciclos de requisição/resposta.
Visão Geral
Jobs em segundo plano são tarefas executadas fora do fluxo principal de uma aplicação, permitindo que operações demoradas ou intensivas não bloqueiem a resposta ao usuário. Esta skill aborda os principais padrões e ferramentas para implementar esses jobs em Python.
Padrões Comuns
1. Fila de Tarefas (Task Queue)
Uma fila de tarefas gerencia a execução assíncrona de funções. Exemplos populares incluem:
- Celery: Sistema maduro com suporte a múltiplos brokers (Redis, RabbitMQ) e resultados.
- RQ (Redis Queue): Simples e leve, dependente apenas do Redis.
- Huey: Fila de tarefas leve com suporte a Redis, SQLite ou sistema de arquivos.
Exemplo com RQ:
from redis import Redis
from rq import Queue
from myapp.tasks import send_email
redis_conn = Redis()
queue = Queue(connection=redis_conn)
job = queue.enqueue(send_email, args=['[email protected]', 'Assunto'])
print(f'Job {job.id} enfileirado')
2. Workers
Workers são processos que consomem tarefas da fila e as executam. Eles podem ser escalados horizontalmente para processar mais jobs simultaneamente.
Exemplo de worker RQ:
rq worker myqueue
Exemplo de worker Celery:
celery -A myapp worker --loglevel=info
3. Arquitetura Orientada a Eventos
Nesta abordagem, eventos (como upload de arquivo, nova inscrição, etc.) disparam a criação de jobs em segundo plano, desacoplando completamente a lógica de negócio da interface do usuário.
Exemplo com Redis Pub/Sub:
import redis
import json
redis_client = redis.Redis()
# Publicador (publisher)
redis_client.publish('new_user', json.dumps({'user_id': 123, 'email': '[email protected]'}))
# Assinante (subscriber) - em um worker separado
pubsub = redis_client.pubsub()
pubsub.subscribe('new_user')
for message in pubsub.listen():
if message['type'] == 'message':
user_data = json.loads(message['data'])
# Processa o novo usuário (ex: enviar e-mail de boas-vindas)
print(f'Processando usuário {user_data["user_id"]}')
Boas Práticas
- Retry e Falhas: Sempre implemente lógica de retry para jobs que podem falhar temporariamente. Use backoff exponencial.
- Timeout: Defina timeouts adequados para evitar que workers fiquem presos em tarefas infinitas.
- Priorização: Use filas separadas para tarefas críticas vs. não críticas.
- Idempotência: Garanta que jobs possam ser executados múltiplas vezes sem efeitos colaterais indesejados.
- Monitoramento: Implemente logging e métricas (ex: Prometheus) para acompanhar o estado dos workers e filas.
Ferramentas Recomendadas
| Ferramenta | Broker | Recursos | Complexidade |
|---|---|---|---|
| Celery | Redis, RabbitMQ, SQS | Tarefas agendadas, resultados, retry avançado | Alta |
| RQ | Redis | Simples, fácil de configurar | Baixa |
| Huey | Redis, SQLite | Tarefas agendadas, retry básico | Baixa |
| Dramatiq | Redis, RabbitMQ | Tarefas agendadas, middleware | Média |
Conclusão
Jobs em segundo plano são essenciais para construir aplicações Python escaláveis e responsivas. Esta skill oferece uma base sólida para escolher e implementar a solução adequada ao seu caso de uso, desde tarefas simples até pipelines complexos orientados a eventos.
Para contribuir ou relatar problemas, visite wshobson/python-background-jobs.