celery模式

Mattakushi4322026-10-25查看 1481复制 1690

何时激活:Celery、任务队列、Redis 代理、异步作业、重试逻辑、定期任务、监控

Download (.md)

📘如何使用这个技能

  1. 1
    复制技能内容·点击上方「Copy SKILL.md」复制全部内容,或 Download 下载到本地
  2. 2
    打开你的 AI 客户端·支持 Claude Code、Trae、Cursor、ChatGPT、DeepSeek、Kimi 等任意 AI 助手
  3. 3
    粘贴为系统提示/知识文件·Claude Code:放入 .claude/skills/ 目录;普通对话:作为首条消息发送并说「请严格按这份技能文档执行」
  4. 4
    直接提出你的需求·AI 会按技能定义的工作流、格式和约束来处理,无需再解释背景

💡 提示:技能生效后,每次对话只需一句需求,AI 会按 SKILL.md 的流程执行。

SKILL.md3682 chars
---
name: celery-patterns
description: "When to activate: Celery, task queues, Redis broker, async jobs, retry logic, periodic tasks, monitoring"
origin: zakr
metadata:
  namespace: zakr/devtools-pack
  version: 1.0.0
  category: engineering
  language: python
  platforms: [claude-code, codex, gemini-cli, cursor, aider, windsurf]
---

# Celery Patterns

## Setup
```python
# celery_app.py
from celery import Celery
from kombu import Queue

celery_app = Celery(
    "myapp",
    broker="redis://redis:6379/0",
    backend="redis://redis:6379/1",
    include=["app.tasks.email", "app.tasks.reports"],
)

celery_app.conf.update(
    task_serializer="json",
    result_serializer="json",
    accept_content=["json"],
    timezone="UTC",
    enable_utc=True,
    # Queues
    task_queues=[
        Queue("high", routing_key="high"),
        Queue("default", routing_key="default"),
        Queue("low", routing_key="low"),
    ],
    task_default_queue="default",
    # Reliability
    task_acks_late=True,          # ack after completion, not on receipt
    task_reject_on_worker_lost=True,
    worker_prefetch_multiplier=1,  # prevent worker starvation
    # Result expiry
    result_expires=3600,
)
```

## Task Definition
```python
from celery import shared_task
from celery.utils.log import get_task_logger
from celery.exceptions import MaxRetriesExceededError

logger = get_task_logger(__name__)

@shared_task(
    bind=True,
    max_retries=3,
    default_retry_delay=60,
    queue="default",
    time_limit=300,      # hard kill after 5 min
    soft_time_limit=240, # raises SoftTimeLimitExceeded after 4 min
    autoretry_for=(TemporaryError,),
    retry_backoff=True,
    retry_backoff_max=600,
    retry_jitter=True,
)
def send_email_task(self, to: str, subject: str, body: str) -> dict:
    try:
        result = email_service.send(to=to, subject=subject, body=body)
        return {"status": "sent", "message_id": result.message_id}
    except PermanentError as exc:
        logger.error("Permanent failure sending to %s: %s", to, exc)
        raise  # don't retry permanent errors
    except TemporaryError as exc:
        logger.warning("Temporary failure, will retry: %s", exc)
        raise self.retry(exc=exc)
```

## Calling Tasks
```python
# Fire and forget
send_email_task.delay(to="user@example.com", subject="Welcome", body="...")

# With options
send_email_task.apply_async(
    kwargs={"to": "user@example.com", "subject": "...", "body": "..."},
    countdown=60,          # delay 60 seconds
    expires=3600,          # discard if not started within 1h
    queue="high",          # override queue
)

# Chain (pipeline)
from celery import chain
result = chain(
    fetch_data.s(source_id),
    process_data.s(),
    save_results.s(),
).delay()

# Group (parallel)
from celery import group
result = group(
    send_email_task.s(email, "Welcome", body) for email in email_list
).delay()
```

## Periodic Tasks (Celery Beat)
```python
from celery.schedules import crontab

celery_app.conf.beat_schedule = {
    "daily-report": {
        "task": "app.tasks.reports.generate_daily_report",
        "schedule": crontab(hour=8, minute=0),
        "kwargs": {"format": "pdf"},
    },
    "cleanup-expired-sessions": {
        "task": "app.tasks.cleanup.remove_expired_sessions",
        "schedule": 300.0,  # every 5 minutes
    },
}
```

## Monitoring
```bash
# Flower (web UI)
celery -A celery_app flower --port=5555

# CLI inspection
celery -A celery_app inspect active    # running tasks
celery -A celery_app inspect reserved  # queued tasks
celery -A celery_app inspect stats     # worker stats
celery -A celery_app events            # real-time event stream
```
来源:skillsdirectory

评论0

登录后参与评论

还没有评论,来抢沙发吧