创作者: Yardon | GitHub: github.com/YardonYan | 版本: v1.0 |
什么时候需要后台任务
HTTP 请求通常要求在几秒内返回响应。但有些操作本身就慢:发送邮件、生成报表、视频转码、AI 推理。如果你在请求线程里做这些事,用户会等 30 秒看到一片空白,然后服务器超时。
后台任务的核心思路是:立即响应"已接收",后台慢慢处理,完成后通知用户。
BackgroundTasks:简单后台执行
python
from fastapi import BackgroundTasks
def send_email(email: str, content: str):
# 模拟慢操作
time.sleep(5)
print(f"已发送邮件到 {email}")
@app.post("/contact")
async def contact(email: str, message: str, tasks: BackgroundTasks):
# 把任务加入后台队列,立即返回响应
tasks.add_task(send_email, email, f"收到消息: {message}")
return {"message": "已收到,我们会尽快回复"}
BackgroundTasks 会把函数放进后台线程池执行。适合:不重、不需要持久化、失败了也没大事的任务。
Celery 简介
如果任务需要持久化、重试、分布式执行------用 Celery:
python
# tasks.py
from celery import Celery
celery = Celery("worker", broker="redis://localhost/0")
@celery.task(bind=True, max_retries=3)
def process_video(self, video_id: str):
try:
# 处理视频...
pass
except Exception as exc:
self.retry(exc=exc, countdown=60) # 60秒后重试
python
# 在 FastAPI 中触发
@app.post("/videos")
async def upload_video(file: UploadFile):
video_id = await save_video(file)
process_video.delay(video_id) # 异步执行
return {"video_id": video_id, "status": "processing"}
本章小结
轻量任务用 BackgroundTasks,重量级任务用 Celery + Redis。下一章:中间件。
📌 创作者: Yardon | 🏠 个人网站: GlimmerAI.top
📖 本章是「FastAPI 全栈后端」系列的第 5 章。
🌟 欢迎大家来观看!