celery模式
Mattakushi4322026-10-25查看 1481复制 1690
何时激活:Celery、任务队列、Redis 代理、异步作业、重试逻辑、定期任务、监控
📘如何使用这个技能
- 1复制技能内容·点击上方「Copy SKILL.md」复制全部内容,或 Download 下载到本地
- 2打开你的 AI 客户端·支持 Claude Code、Trae、Cursor、ChatGPT、DeepSeek、Kimi 等任意 AI 助手
- 3粘贴为系统提示/知识文件·Claude Code:放入 .claude/skills/ 目录;普通对话:作为首条消息发送并说「请严格按这份技能文档执行」
- 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
```