任务队列是分布式系统中用于管理后台任务的强大工具,允许将耗时的操作异步执行,从而提高Web应用的响应速度。
核心概念
任务队列包含三个主要组件:
-
生产者(Producer): 创建并发送任务到队列
-
队列(Queue): 存储待处理的任务
-
消费者(Worker/Consumer): 从队列获取并执行任务
主要库
2.1 Celery - 最流行的分布式任务队列
# 安装: pip install celery redis
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task
def add(x, y):
return x + y
# 调用任务
result = add.delay(4, 4)
print(result.get()) # 获取结果(阻塞)
特点:
-
支持多种消息代理(Redis, RabbitMQ等)
-
定时任务(beat)
-
任务重试机制
-
结果存储
-
分布式工作节点
2.2 RQ (Redis Queue) - 简单轻量级方案
# 安装: pip install rq
from redis import Redis
from rq import Queue
from my_module import count_words_at_url
q = Queue(connection=Redis())
result = q.enqueue(count_words_at_url, 'http://example.com')
# worker启动命令: rq worker
特点:
-
基于Redis
-
比Celery更简单
-
适合小型项目
-
缺少一些高级功能
2.3 Dramatiq - 高性能替代方案
# 安装: pip install dramatiq redis
import dramatiq
@dramatiq.actor
def add(x, y):
return x + y
add.send(4, 4)
# 启动worker: dramatiq my_module
特点:
-
性能优于Celery
-
更好的任务优先级
-
中间件系统
-
更现代的API设计
任务队列的常见使用场景
-
耗时操作:
@app.task def process_image(image_path): # 图像处理耗时操作 time.sleep(10) return result
-
定时任务:
from celery.schedules import crontab app.conf.beat_schedule = { 'every-monday-morning': { 'task': 'tasks.send_weekly_report', 'schedule': crontab(hour=7, minute=30, day_of_week=1), }, }
-
微服务通信:
# 服务A发送任务 process_data.delay(user_id, data) # 服务B处理任务 @app.task def process_data(user_id, data): # 处理数据 pass
-
批量处理:
for item in large_dataset: process_item.delay(item)
高级特性
4.1 任务重试
@app.task(bind=True, max_retries=3)
def send_email(self, user_id):
try:
user = User.get(user_id)
user.send_email()
except SMTPException as exc:
self.retry(exc=exc, countdown=60) # 60秒后重试
4.2 任务链
from celery import chain chain(task1.s(1, 2), task2.s(3), task3.s()).apply_async()
4.3 任务结果处理
@app.task
def fetch_data(url):
return requests.get(url).json()
def handle_result(result):
print(f"Got data: {result}")
fetch_data.delay('http://api.com').then(handle_result)
4.4 监控与管理
-
Flower: Celery的实时监控工具
pip install flower flower -A proj --port=5555
-
RQ Dashboard: RQ的监控界面
pip install rq-dashboard rq-dashboard
选择适合的任务队列
特性 | Celery | RQ | Dramatiq |
---|---|---|---|
复杂性 | 高 | 低 | 中 |
性能 | 中 | 低 | 高 |
Redis支持 | ✓ | ✓ | ✓ |
RabbitMQ支持 | ✓ | ✗ | ✓ |
定时任务 | ✓ | ✗ | ✓ |
任务优先级 | 有限 | ✗ | ✓ |
Python3支持 | ✓ | ✓ | ✓ |
选择建议:
-
需要全面功能 → Celery
-
简单项目 → RQ
-
高性能需求 → Dramatiq
部署注意事项
-
消息持久化: 确保任务不会因服务器重启丢失
-
监控: 设置任务失败警报
-
扩展性: 根据负载动态增减worker
-
资源限制: 控制任务内存/CPU使用
-
任务超时: 设置合理的超时时间
@app.task(time_limit=300) # 5分钟超时
def long_running_task():
pass
任务队列是现代Python应用架构中的重要组件,合理使用可以显著提升应用性能和用户体验。