-
我的 asyncio 服务接口全是 async/await,QPS 却低得离谱,我以为是部署配置问题,最后揪出一个同步的 requests 调用,把整个单线程事件循环死死卡住的深度复盘
我用 asyncio + FastAPI 写了个服务,接口全是 async def,每处该 await 的都 await 了,自以为是纯异步高并发。可压测时 QPS 低得怀疑人生,100 个并发像排队过独木桥一样串行处理。我一度怀疑 uvicorn worker 数、想上多进程,扒代码才发现罪魁祸首:一个 async 接口里,我图方便调了同步阻塞的 requests.get——它把整个单线程事件循…- 0
- 0
-
从 Python 2.7 + Flask 同步 WSGI + pip + 裸 SQL 拼接 + 无类型注解 远古单体 → Python 3.13 free-threaded 无 GIL + FastAPI + Pydantic v2 + SQLAlchemy 2.0 async + asyncpg + uv + Ruff + mypy strict + Polars + Pytest + Hypothesis 现代异步全栈 87 天踩坑录:绞杀者模式 + 47 套修法 + 7 个 P0 复盘 + 6 条工程哲学
27 位后端工程师 87 天用绞杀者模式把一个跑了九年、累计 57 万行的 Python 2.7 + Flask 同步单体,平滑迁移到 2026 年 Python 3.13 free-threaded 无 GIL + FastAPI + Pydantic v2 + SQLAlchemy 2.0 async + uv + Ruff + mypy strict + Polars + Pytest + …- 2
- 0
-
从 Python 3.7 + Flask 1 + SQLAlchemy 1.3 + Celery 4 + Gunicorn 19 + pip + virtualenv + pylint + unittest + Jenkins 单体后端 → Python 3.13 free-threading + FastAPI 0.115 + Litestar 2.13 + SQLAlchemy 2.1 async + asyncpg + Pydantic 2.10 + uv 0.5 + Ruff 0.9 + mypy 1.13 strict + Polars 1.20 + DuckDB 1.2 + Granian 1.7 + uvloop + Dramatiq 1.17 + Loguru + OpenTelemetry Python SDK + Pytest 8.3 + Hypothesis + Locust 2.32 全栈异步 Python 现代化 87 天踩坑录:23 反模式 + 27 修法
27 位 Python 工程师 87 天把公司 Python 3.7 + Flask 1 + SQLAlchemy 1.3 + Celery 4 + Gunicorn 19 单体后端整体迁移到 2026 年 Python 3.13 free-threading + FastAPI 0.115 + Litestar 2.13 + SQLAlchemy 2.1 async + asyncpg + Py…- 3
- 0
-
从 Python 3.10 + Pandas 1.5 + Pydantic 1 + SQLAlchemy 1.4 → Python 3.13 + Polars + DuckDB + Pydantic 2 + SQLAlchemy 2 + uv + Ruff 全栈升级 41 天踩坑录:14 反模式 + 15 修法
33 位工程师 41 天把公司"数据流水线 / 风控引擎 / 推荐系统 / 报表 / 内部工具 / ML 训练管线"6 大场景,从 Python 3.10 + Django 4.2 + Pandas 1.5 + FastAPI 0.95 + Celery 5.2 + SQLAlchemy 1.4 全栈升级到 Python 3.13 + Django 5.1 + FastAPI …- 0
- 0
-
从 Python 3.10 → 3.13 + FastAPI + Pydantic v2 + SQLAlchemy 2.0 全栈现代化 17 天踩坑录:8 反模式 + 11 修法
某 28 万 DAU 在线教育平台从 Python 3.10 + FastAPI 0.95 + Pydantic v1 + Celery 5 + SQLAlchemy 1.4 升级到 Python 3.13 + Free-Threading + FastAPI 0.115 + Pydantic v2.10 + Celery 5.4 + SQLAlchemy 2.0 + Uvicorn 0.32 +…- 0
- 0
-
FastAPI + uvicorn 默认配置导致 K8s 滚动发布每次丢 30-50 请求的 5 天复盘:graceful shutdown 三件套配置 + ASGI lifespan drain 逻辑
每次 K8s 滚动发布 api-gateway 都丢 30-50 请求,3 个月积累出 ¥4.8w 支付对账偏差。根因是 K8s SIGTERM 与 Endpoint 移除并行、uvicorn 默认 timeout-graceful-shutdown 立即退出叠加。落地 uvicorn 参数 + K8s preStop + 应用层 lifespan drain 三件套,28 次发布零丢失。- 0
- 0
-
LLM 客服流式输出被 Nginx + Cloudflare + uvicorn + HTTP/2 四层代理悄悄变成批量的 3 天复盘:SSE 链路全栈优化 + 零缓冲发布模板
OpenAI 50ms 一个 chunk 流畅输出,用户却感受到一字憋几秒一下子吐出来。3 天复盘揪出 Nginx proxy_buffering、Cloudflare smart buffer、uvicorn chunk 合并、HTTP/2 frame 合并四层叠加根因,5 种修法 + 5 种流式协议横向对比 + 决策树 + 10 条 LLM SSE 链路工程纪律,NPS 从 42 提到 67。- 0
- 0
-
FastAPI 每隔 6 小时变僵尸:SQLAlchemy async 连接池静默泄漏 4 天复盘
FastAPI + SQLAlchemy 2.x async 服务每 6 小时连接池打满变僵尸。根因:Depends 用 return 而非 yield + 中间件吞掉 CancelledError + SQLAlchemy close 时机微妙。完整复盘 + 5 层修法 + 监控告警。- 0
- 0
-
Python 内存泄漏定位实战:tracemalloc + objgraph 8 小时找到 FastAPI 服务 32GB 内存被吃满的根因
分享一次 FastAPI 推荐服务内存从 1.2GB 缓慢吃到 32GB 触发 OOMKilled 的真实排查:用 tracemalloc 定位分配热点 + objgraph 追引用链,8 小时找到三个独立泄漏点(无 bound 缓存、调试代码持引用、fire-and-forget task 抓大对象),附完整工具链对比和预防机制。- 2
- 0
-
asyncio event loop 被同步代码卡死的真实事故:P99 从 80ms 飙到 12s 的 6 小时复盘
一个隐藏在 async 函数里的 requests.get() 调用,把订单查询服务的 P99 从 80ms 推到 12 秒。本文用 1 万字+ 的篇幅完整复盘 6 小时排查过程:py-spy 抓栈、事故时间线、5 种修法横向对比、Prometheus loop lag 监控、Kubernetes 探针、AST 静态扫描规则,以及事故后我们对 47 个 Python 服务做的全面体检。- 8
- 0
-
LLM 流式输出完全指南:从一次"前端等了 20 秒白屏"看懂 SSE 流式响应
2024 年我给产品做 AI 对话助手,第一版很朴素:等大模型整段答案生成完再一次性返回。同事试用时盯着空白对话框干等了二十秒,扭头问我是不是卡死了。我想到该做流式,以为就是把后端 return 改成 yield、前端循环读一下。结果改完问题一个接一个:套了 Nginx 流式完全没生效,还是白屏然后整段蹦出;前端偶发 JSON.parse 报错本地复现不出;模型生成到一半报限流错前端直接僵死;用户…- 2
- 0
-
FastAPI 单实例 QPS 上不去:asyncio 隐性阻塞的 5 个真实坑
FastAPI 压测 QPS 320 / p99 2 秒,看代码"全用了 async",py-spy 抓出一处 requests.get 阻了 event loop。本文讲透 asyncio 单线程协作模型 + 5 种隐性阻塞 + 火焰图诊断 + uvloop + asyncpg + 进程池 + 4 倍 QPS 优化路径,附完整代码。- 0
- 0
FastAPI
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!












