惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Palo Alto Networks Blog
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
量子位
Blog — PlanetScale
Blog — PlanetScale
有赞技术团队
有赞技术团队
腾讯CDC
博客园 - Franky
The Cloudflare Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hugging Face - Blog
Hugging Face - Blog
H
Heimdal Security Blog
L
LangChain Blog
V
V2EX
Jina AI
Jina AI
美团技术团队
V2EX - 技术
V2EX - 技术
V
Visual Studio Blog
Google Online Security Blog
Google Online Security Blog
人人都是产品经理
人人都是产品经理
Security Archives - TechRepublic
Security Archives - TechRepublic
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Know Your Adversary
Know Your Adversary
Hacker News: Ask HN
Hacker News: Ask HN
Apple Machine Learning Research
Apple Machine Learning Research
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Threat Research - Cisco Blogs
Y
Y Combinator Blog
博客园_首页
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Spread Privacy
Spread Privacy
C
Cisco Blogs
博客园 - 三生石上(FineUI控件)
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog
PCI Perspectives
PCI Perspectives
MongoDB | Blog
MongoDB | Blog
A
About on SuperTechFans
B
Blog RSS Feed
N
News and Events Feed by Topic
L
LINUX DO - 热门话题
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threatpost
月光博客
月光博客
Recent Announcements
Recent Announcements
D
DataBreaches.Net
IT之家
IT之家
C
Cyber Attacks, Cyber Crime and Cyber Security

博客园 - 一名程序媛呀

Anki插件开发必知必会:钩子函数与右键菜单定制 httpx 传参总报错?这次把 GET、POST、文件上传到响应处理的坑给你一次填平 从卡顿到丝滑:FastAPI 调用外部 API 的正确姿势(httpx 实战) 还在 XHR、Fetch 和 Axios 之间纠结?我踩过的坑,希望你一个都不用碰到 你的REST接口还在“过度投喂”数据吗?——FastAPI + GraphQL实战避坑指南 Uvicorn、Gunicorn 傻傻分不清?FastAPI 生产部署避坑指南 Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招! 刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API 别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了 掏出手机就能搭个 WebDAV 同步服务器?这操作有点香 别只盯着GitBook了!这个文档神器让你的笔记秒变网站 写爬虫时用了代理还被封?Python 代理的那些隐藏坑,我替你踩明白了 FastAPI 身份验证总踩坑?这份 FastAPI Users “避坑指南”请收好 旧手机别扔!用 Termux 搭个私人云盘,比网盘香多了 你的FastAPI又在服务器上“跑不起来”了?来,今天咱把打包这件事彻底聊透 写页面时别再把 Element Plus 整个搬进来啦!Vue3按需加载的坑我帮你踩平了 前端包管理咋选?我从npm叛逃到pnpm的血泪史(附避坑指南) 聊聊 fetch 使用中我踩过的那些坑和正确打开方式 FastApiAdmin 后端接口开发好了,前端管理界面怎么调用与显示? 给 FastApiAdmin 加个“会议纪要”模块,我把后端二次开发的坑踩了个遍 我用了FastApiAdmin后,连夜把踩过的坑都整理出来了 告别 Typora 后的新欢:我把所有笔记迁移到了 Obsidian 这个“第二大脑” 你的Agent API还在裸奔?从认证到沙箱,我用FastAPI搭了几道防线 让 FastAPI Agent 思考不阻塞:手把手教你实现异步任务与后台处理方案 让FastAPI Agent真正记住你:聊聊会话记忆与持久化存储的落地实践 FastAPI Agent 函数调用实战:我让 AI 学会了“自己动手查天气“ 初探:用 FastAPI 搭建你的第一个 AI Agent 接口 FastAPI 少有人提的实用技巧:把 Depends 依赖提到路由层,代码少写60% FastAPI 生产环境静态文件完全指南:从 /favicon.ico 404 到 HSTS 混合内容,一次全根治 用了loguru我才明白,Python日志还能这么写 FastAPI 后台任务:BackgroundTasks 的使用场景与注意事项 FastAPI配置管理避坑指南:从硬编码到 .env 与 pydantic_settings 类,连路由用法都给你捋清楚 FastAPI 文件上传避坑全指南:分块存盘、类型校验与安全兜底 FastAPI + Pydantic 模型终极实战手册:从能跑就行到固若金汤,这些技巧你一定用得上 FastAPI + SQLAlchemy 2.0 通用CRUD操作手册 —— 从同步到异步,一次讲透 FastAPI订单防超卖实战:从数据库锁到Saga分布式事务,这一篇给你理清了 FastAPI 生产环境避坑指南:用 Alembic 管理数据库迁移,别再手动改表结构了! FastAPI服务半夜又挂了?先别急着重启,查查你的数据库连接池“池子”是不是漏了 FastAPI数据库ORM怎么选?我肝了三个Demo后,终于不再纠结了 Vue 3 组件通信,别只会用 Props 和 Emits 了,这几个狠活儿你得看看 Vue 3 组合式 API 香是香,但从Vue2迁移时你可别像我当初一样踩进这 3 个深坑里 我用fastapi-scaff搭了个项目,两天工期缩到两小时,老板以为我开挂了 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! FastAPI自动生成的API文档太丑?我花了一晚上把它改成了客户愿意付费的样子 告别手写 API 胶水代码:FastAPI 与 Vue 的“契约自动机” OpenAPI 实战 FastAPI + Vue 前后端分离实战:我的项目结构“避坑指南” FastAPI + Celery 实战:异步任务里调用 Redis 和数据库的全解析,及生产级组织方案 FastAPI里玩转Redis和数据库的正确姿势,别让异步任务把你坑哭了! FastAPI子应用挂载:别再让root_path坑你一夜 FastAPI项目半夜报警吵醒你?聊聊告警这事儿怎么搞! 别再数据线了!用FastAPI 5分钟搭个局域网文件+剪贴板神器 FastAPI单元测试实战:别等上线被喷才后悔,TestClient用对了真香! FastAPI状态共享秘籍:别再让中间件、依赖和路由“各自为政”了! FastAPI实战:WebSocket vs Socket.IO,这回真给我整明白了! 从0到1,FastAPI + PostgreSQL + Tortoise ORM 实战避坑指南 FastAPI + PostgreSQL 实战:给应用装上“缓存”和“日志”翅膀 FastAPI + PostgreSQL 实战:从入门到不踩坑,一次讲透
FastAPI + Celery 实战:异步任务的坑与解法,我帮你踩了一遍
一名程序媛呀 · 2026-03-31 · via 博客园 - 一名程序媛呀

你写了个 FastAPI 接口,用户一请求,得等好几秒才返回,是不是急得想摔键盘?😤 别急着换电脑,八成是你把“耗时任务”堵在了接口里。

今天咱们就聊聊怎么用 Celery 这个老牌异步神器,给 FastAPI 提提速,顺便把我当年踩过的那些坑(比如循环导入、worker 启动失败)一次性说清楚。

🎯 核心脉络

▶️ 问题场景:接口里跑耗时任务,用户干等

▶️ 核心原理:Celery 是啥?为什么用它?

▶️ 实战演示:安装、配置、写任务、结合 FastAPI

▶️ 常见坑:循环导入、worker 找不到 app、Redis 连接数爆炸

▶️ 进阶思考:生产环境还要加点啥

💥 一、痛点:你的接口为什么这么慢?

有天你写了个 API,用户传个文件上来,你要做压缩、加水印、还要发邮件通知。一套下来可能 5 秒起步。这时候用户直接卡在“加载中”……

你可能会说:“加个 async def 不就行了?” 哎,单纯的 async/await 只能解决 IO 等待,治不了 CPU 密集型的活。这时候就需要一个真正的“后台打工仔”——Celery

🧠 二、Celery 是个啥?用个比喻你就懂了

你把 FastAPI 想象成餐厅的前台点菜员,用户一来,点菜员记下菜单。

但做菜太慢,不能让客人站在前台等。所以 Celery 就是后厨的厨师团队:你丢个任务进去(比如“做一份宫保鸡丁”),厨师慢慢做,做完放传菜口。

前台可以马上给客人一个“你的菜在做啦”的号牌,过会儿凭号牌来取。

中间还得有个“订单板”——那就是 消息队列(Redis 或 RabbitMQ)。前台把任务写上去,厨师从上面拿。是不是瞬间清晰了?

🛠️ 三、实战:从零搭一套 FastAPI + Celery

好,咱们动手。这里千万别学我当初偷懒跳过环境准备,直接 pip install 就跑,后面一堆版本冲突的坑。

📦 1. 安装依赖

打开终端,一条龙装好:

uv add fastapi uvicorn celery redis

我用 Redis 做 broker(消息队列),你如果喜欢 RabbitMQ 也行,但 Redis 更轻量,本地调试方便。

🏗️ 2. 目录结构(血的教训)

project/
├── app.py # FastAPI 应用
├── tasks.py # Celery 任务定义
├── config.py # 配置(别写死在代码里)
└── pyproject.toml

重要的事说三遍:不要把 Celery 实例和 FastAPI app 写在同一个文件里! 不然循环导入会教你做人。

📝 3. 写配置文件 config.py

REDIS_URL = "redis://localhost:6379/0"

🧵 4. 定义 Celery 任务 tasks.py

from celery import Celery
from config import REDIS_URL

celery_app = Celery(
    "myapp",
    broker=REDIS_URL,
    backend=REDIS_URL
)

@celery_app.task
def add(a, b):
    import time
    time.sleep(5) # 模拟耗时计算
    return a + b

这里注意:celery_app 是独立的,别引用 FastAPI 的任何东西,否则后面 worker 启动会一脸懵。

🚀 5. FastAPI 中调用任务 app.py

from fastapi import FastAPI
from tasks import add

app = FastAPI()

@app.get("/sum")
async def compute(x: int, y: int):
    # 异步提交任务,立刻返回任务ID
    task = add.delay(x, y)
    return {"task_id": task.id, "status": "processing"}

@app.get("/result/{task_id}")
async def get_result(task_id: str):
    from celery.result import AsyncResult
    from tasks import celery_app
    
    task = AsyncResult(task_id, app=celery_app)
    if task.ready():
        return {"status": "completed", "result": task.result}

    return {"status": "pending"}

你看,用户请求 /sum?x=3&y=5 会立刻得到一个 task_id,然后轮询 /result/{task_id} 就能拿到结果。再也不怕接口超时了!

⚠️ 四、你一定会踩的几个坑(我先帮你踩了)

🔁 坑1:循环导入

如果你在 tasks.py 里导入了 FastAPI 的 app,或者在 app.py 里又导入任务…… 恭喜你,获得一个 ImportError

解法:保持单向依赖,任务里不要依赖 app。

🧑‍🍳 坑2:worker 启动失败

启动命令 celery -A tasks worker --loglevel=info,注意 -A tasks 是指 tasks.py 里的 celery_app 变量。

官方文档说默认找名为 celery 的变量,但咱们叫 celery_app,就得显式指定。我当初忘了,报错“KeyError: 'celery'”,原地抓狂半小时。

🔌 坑3:Redis 连接数爆炸 

Celery 默认会开很多连接,尤其生产环境。记得在配置里加上 broker_pool_limit = 10,否则 Redis 连接数飙升,最后拒绝服务。

🔮 五、进阶思考:生产环境还能怎么玩?

你以为这样就完了?Celery 还有定时任务(beat),比如每天凌晨三点清理数据库。另外,任务失败了怎么办?可以配置重试:

@celery_app.task(bind=True, max_retries=3)
def unstable_task(self):
    try:
        # 可能失败的操作
    except Exception as e:
        self.retry(exc=e, countdown=60)

还有监控工具 Flower,跑起来就能看任务队列、成功失败数量,像逛淘宝一样方便。命令:celery -A tasks flower,然后浏览器打开 localhost:5555

好了,今天这篇算是把我用 FastAPI + Celery 从入门到“被坑”再到“平坑”的心里话都倒出来了。你写代码的时候如果遇到其他奇葩报错,欢迎在评论区甩过来,我帮你看看。觉得有用的话,点个关注或者收藏,免得下次想用翻不到。毕竟… 掉坑的记忆总会模糊,但收藏夹里的文章不会跑。😄