Pular para o conteúdo
Skillpedia
APIs e servidores (backend)41 mil · #4924

python-background-jobs

Faz seu agente gerenciar tarefas em segundo plano e filas de trabalho em Python. É útil para processar tarefas longas sem travar o programa principal.

O que ela faz

Esta habilidade ajuda a organizar tarefas que levam muito tempo para serem concluídas, como enviar emails em massa ou gerar relatórios. Ela permite que seu programa responda rapidamente ao usuário enquanto as tarefas pesadas são feitas em segundo plano.

Quando usar

  • ✓Enviar muitos emails de uma vez.
  • ✓Gerar um relatório grande que demora para ser criado.
  • ✓Processar um upload de arquivo que leva tempo.

Exemplo do que pedir para a IA

“Como posso fazer para que meu programa envie um email para 1000 pessoas sem travar?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/wshobson/agents/blob/main/plugins/python-development/skills/python-background-jobs/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/wshobson/agents/blob/main/plugins/python-development/skills/python-background-jobs/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Seu programa envia uma 'tarefa' para uma fila. Um 'trabalhador' separado pega essa tarefa e a executa. Isso libera seu programa principal para continuar respondendo.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add wshobson/agents --skill python-background-jobs

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/wshobson/agents/main/plugins/python-development/skills/python-background-jobs/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Jobs em Segundo Plano e Filas de Tarefas em Python

Desacople trabalhos demorados ou não confiáveis dos ciclos de requisição/resposta. Retorne imediatamente para o usuário enquanto os workers em segundo plano cuidam do trabalho pesado de forma assíncrona.

Quando Usar Esta Habilidade

  • Processar tarefas que levam mais de alguns segundos
  • Enviar e-mails, notificações ou webhooks
  • Gerar relatórios ou exportar dados
  • Processar uploads ou transformações de mídia
  • Integrar com serviços externos não confiáveis
  • Construir arquiteturas orientadas a eventos

Conceitos Principais

1. Padrão de Fila de Tarefas

A API aceita a requisição, enfileira um trabalho e retorna imediatamente com um ID do trabalho. Workers processam os trabalhos de forma assíncrona.

2. Idempotência

Tarefas podem ser retentadas em caso de falha. Projete para reexecução segura.

3. Máquina de Estados do Trabalho

Trabalhos transitam por estados: pendente → em execução → bem-sucedido/falhou.

4. Entrega "Pelo Menos Uma Vez"

A maioria das filas garante a entrega "pelo menos uma vez". Seu código deve lidar com duplicatas.

Início Rápido

Esta habilidade usa o Celery para exemplos, uma fila de tarefas amplamente adotada. Alternativas como RQ, Dramatiq e soluções nativas da nuvem (AWS SQS, GCP Tasks) são escolhas igualmente válidas.

from celery import Celery

app = Celery("tasks", broker="redis://localhost:6379")

@app.task
def send_email(to: str, subject: str, body: str) -> None:
    # This runs in a background worker
    email_client.send(to, subject, body)

# In your API handler
send_email.delay("user@example.com", "Welcome!", "Thanks for signing up")

Padrões Fundamentais

Padrão 1: Retornar ID do Trabalho Imediatamente

Para operações que excedem alguns segundos, retorne um ID do trabalho e processe de forma assíncrona.

from uuid import uuid4
from dataclasses import dataclass
from enum import Enum
from datetime import datetime

class JobStatus(Enum):
    PENDING = "pending"
    RUNNING = "running"
    SUCCEEDED = "succeeded"
    FAILED = "failed"

@dataclass
class Job:
    id: str
    status: JobStatus
    created_at: datetime
    started_at: datetime | None = None
    completed_at: datetime | None = None
    result: dict | None = None
    error: str | None = None

# API endpoint
async def start_export(request: ExportRequest) -> JobResponse:
    """Start export job and return job ID."""
    job_id = str(uuid4())

    # Persist job record
    await jobs_repo.create(Job(
        id=job_id,
        status=JobStatus.PENDING,
        created_at=datetime.utcnow(),
    ))

    # Enqueue task for background processing
    await task_queue.enqueue(
        "export_data",
        job_id=job_id,
        params=request.model_dump(),
    )

    # Return immediately with job ID
    return JobResponse(
        job_id=job_id,
        status="pending",
        poll_url=f"/jobs/{job_id}",
    )

Padrão 2: Configuração de Tarefas Celery

Configure tarefas Celery com configurações adequadas de retentativa e tempo limite.

from celery import Celery

app = Celery("tasks", broker="redis://localhost:6379")

# Global configuration
app.conf.update(
    task_time_limit=3600,          # Hard limit: 1 hour
    task_soft_time_limit=3000,      # Soft limit: 50 minutes
    task_acks_late=True,            # Acknowledge after completion
    task_reject_on_worker_lost=True,
    worker_prefetch_multiplier=1,   # Don't prefetch too many tasks
)

@app.task(
    bind=True,
    max_retries=3,
    default_retry_delay=60,
    autoretry_for=(ConnectionError, TimeoutError),
)
def process_payment(self, payment_id: str) -> dict:
    """Process payment with automatic retry on transient errors."""
    try:
        result = payment_gateway.charge(payment_id)
        return {"status": "success", "transaction_id": result.id}
    except PaymentDeclinedError as e:
        # Don't retry permanent failures
        return {"status": "declined", "reason": str(e)}
    except TransientError as e:
        # Retry with exponential backoff
        raise self.retry(exc=e, countdown=2 ** self.request.retries * 60)

Padrão 3: Tornar Tarefas Idempotentes

Workers podem retentar em caso de falha ou tempo limite. Projete para reexecução segura.

@app.task(bind=True)
def process_order(self, order_id: str) -> None:
    """Processa o pedido de forma idempotente."""
    order = orders_repo.get(order_id)

    # Já processado? Retorne cedo
    if order.status == OrderStatus.COMPLETED:
        logger.info("Pedido já processado", order_id=order_id)
        return

    # Já em andamento? Verifique se devemos continuar
    if order.status == OrderStatus.PROCESSING:

…
Perguntas frequentes

O que é uma 'tarefa em segundo plano'?

É uma ação que seu programa precisa fazer, mas que pode demorar. Em vez de fazer isso imediatamente, ela é colocada em uma fila para ser executada depois, sem interromper o uso normal do programa.

O que acontece se a tarefa falhar?

O sistema pode tentar executar a tarefa novamente automaticamente. Por isso, é importante que a tarefa seja 'idempotente', ou seja, que executá-la várias vezes não cause problemas.

Como eu sei o status da tarefa?

Geralmente, você recebe um 'ID' para a tarefa quando a envia. Você pode usar esse ID para perguntar ao sistema se a tarefa já terminou, se está em andamento ou se falhou.

Detalhes

Descrição original do autor

Python background job patterns including task queues, workers, and event-driven architecture. Use when implementing async task processing, job queues, long-running operations, or decoupling work from request/response cycles.

repo: wshobson/agents

Popularidade

Estrelas no GitHub
41 mil
Posição no ranking
#4924
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas