FastAPI 全栈后端(五):后台任务与消息队列

创作者: 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 章。

🌟 欢迎大家来观看!

相关推荐
大怪v5 小时前
被AI绑架了!
ai编程
To_OC5 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
迅易科技5 小时前
从场景验证到Agent上线:迅易 × WorkBuddy如何帮助企业建设AI能力?
人工智能·ai·腾讯云
腻害兔5 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
不好听6136 小时前
从一行 JSX 到屏幕像素:前端开发者必须懂的浏览器渲染管线
前端
恒拓高科WorkPlus6 小时前
企业级内网即时通讯建设模型:BeeWorks内网IM四层架构
前端
前端小李子7 小时前
前端环境变量裸奔?我用 EnvShield 给它穿了件防弹衣
前端
youtootech7 小时前
HarmonyOS《柚兔学伴》项目实战25-我的页面、Web 嵌入与项目总结
前端·华为·harmonyos
神奇霸王龙7 小时前
GB/T 46886 闭环屠夫:5 旗舰多模态 LLM 工业质检实测
人工智能·计算机视觉·ai·开源·ai编程·本地部署
小林ixn7 小时前
从零到一理解 React 父子组件通信:手写一个 Todo 应用带你彻底搞懂单向数据流
前端·javascript·react.js