-
我想用多线程加速一段纯计算的代码,开了 8 个线程满心以为能快 8 倍,结果不但没快、反而比单线程还慢,因为 Python 有个 GIL、同一时刻只让一个线程真正在算的深度复盘
我有一段 CPU 密集的计算(大量纯数值运算),单线程跑得慢,我想这台机器有 8 核、开 8 个线程并行算不就快 8 倍?于是用 threading 开了 8 个线程分摊计算。结果一测:不但没快 8 倍,反而比单线程还慢,CPU 监控显示始终只有一个核在忙、其他核闲着。复盘才搞懂:CPython 有一个 GIL(全局解释器锁),同一时刻只允许一个线程执行 Python 字节码;我开的 8 个线程没…- 2
- 0
-
一段用多线程给 CPU 密集计算加速的 Python 代码,开了八个线程却比单线程还慢,我被 GIL 实实在在上了一课:一次多线程并行误区的深度复盘
一个 CPU 密集计算单线程跑十几秒,我想当然地以为 8 核机器开 8 个线程能快好几倍,结果不但没快反而更慢,而且 8 核机器 CPU 利用率始终只有一个核的量。根因是 CPython 的 GIL(全局解释器锁):同一时刻只有一个线程能执行 Python 字节码,8 个线程只能轮流抢 GIL、本质串行用不上多核,还多了切换开销。本文讲透 GIL 是什么、为何让多线程对 CPU 密集无效却对 IO…- 8
- 0
-
我的 asyncio 服务接口全是 async/await,QPS 却低得离谱,我以为是部署配置问题,最后揪出一个同步的 requests 调用,把整个单线程事件循环死死卡住的深度复盘
我用 asyncio + FastAPI 写了个服务,接口全是 async def,每处该 await 的都 await 了,自以为是纯异步高并发。可压测时 QPS 低得怀疑人生,100 个并发像排队过独木桥一样串行处理。我一度怀疑 uvicorn worker 数、想上多进程,扒代码才发现罪魁祸首:一个 async 接口里,我图方便调了同步阻塞的 requests.get——它把整个单线程事件循…- 0
- 0
-
开了多线程反而更慢:Python GIL 避坑复盘
这是一次信心满满地优化结果越优化越慢的尴尬经历。我有一个 Python 写的数据处理脚本要对几百万条数据做密集计算,单线程跑下来要好几分钟。我看了看服务器 8 核 CPU,跑这脚本时却只有一个核在忙其余 7 个核在睡大觉,这不浪费吗?于是我信心满满把任务拆成 8 份开 8 个线程并行处理,想着 8 个核一起干这下总该快 8 倍了吧。改完一跑我傻眼了:不仅没快反而比单线程还慢了一点!我对着代码百思不…- 0
- 0
-
8 个线程比单线程还慢:Python GIL 并发避坑
有个数据处理脚本要对几百万条记录做一轮挺重的纯 CPU 计算,单线程跑十几分钟,老板嫌慢。我心想机器是 8 核的,开个线程池把活儿分到 8 个线程上理论上能快好几倍,改完信心满满一跑却当场傻眼:不但没快,反而比单线程还慢了一点,而 CPU 监控显示 8 个核里始终只有一个在忙、其余七个基本在睡觉。我一度怀疑线程池配置有问题,换写法调参数纹丝不动,直到想起 Python 那个绕不开的名字——GIL …- 0
- 0
-
Python 并发模型选型:GIL、多线程、asyncio 与多进程到底怎么选
同事用 8 个线程跑纯 CPU 的图像处理,结果比单线程还慢——这是 Python 并发里最经典的困惑。从 GIL 这把全局锁讲起,把多线程、asyncio、多进程三套模型的脾性、坑和适用边界逐一摊开:IO 密集用线程或协程,CPU 密集只能靠多进程,asyncio 全程异步否则卡死事件循环,有 GIL 也照样要加锁。最后收口成一棵先问任务在等还是在算的选型决策树。- 0
- 0
-
从一套用 Python 2.7 写的习惯把整张表一次性读进内存同步串行一个接一个调接口到处传裸字典靠 print 调试用 requirements.txt 锁不住依赖的祖传 ETL 脚本、核心任务 rows db.query SELECT 星 FROM orders fetchall 把整张订单表一次性全部读进内存的大列表数据量翻倍后第一次突破几千万行这条 fetchall 瞬间吃光全部内存触发 OOM Killer 进程被当场杀死且无断点续传一晚处理前功尽弃、第二天加内存重跑又撞上第二堵墙这个任务处理每一行都同步调一个外部风控接口打标几千万行就是几千万次串行一个等一个的网络请求即便单次几十毫秒累加起来也是几十个小时报表延迟大半天业务方炸锅 + 纯 Python for 循环逐元素做数值计算解释器开销巨大几百万次累加拖成几分钟想用多线程加速又撞上 GIL 更慢 + 到处传裸 dict 有哪些字段什么类型全靠脑子记拼错 order amount 成 amout 静默 KeyError 或 get 返回 None 一路带错往下 + 无任何类型注解参数传错少给字段类型不符全靠运行时炸潜伏到冷门分支凌晨才爆 + requirements.txt 加 pip freeze 锁不住传递依赖换台机器装出另一套在我机器上是好的一上生产就报谁也没见过的错 + 裸 try except pass 吞掉异常失败信息静默销毁手搓 while True 重试无上限无退避不区分该不该重试 + 满地 print 调试线上无级别无结构无法检索出问题两眼一抹黑考古整夜 → 2026 Python 3.12 现代工程体系 生成器加迭代器逐块流式处理内存占用恒定与数据总量无关 + asyncio 加 aiohttp 并发 IO 大量等待重叠几十小时压缩到分钟级 + numpy pandas 向量化底层 C 批量或 multiprocessing 绕过 GIL 真并行 + dataclass 带类型数据类字段明确拼错即报错 IDE 补全 + type hints 加 mypy 静态检查类型错误运行前揪出接进 CI + uv 加 lock 文件精确锁定整棵依赖树任何机器字节级一致 + 结构化异常加 tenacity 声明式退避重试失败可见重试有章法 + logging 结构化日志分级别可配置可检索 + pydantic-settings 集中配置 + pytest 自动回归 87 天战役复盘:47 套工程修法 + 8 个 P0 复盘 + 6 条工程哲学
5 人的数据平台团队 87 天把一套支撑公司所有数据报表的 ETL 与数据服务,从一堆用 Python 2.7 写的、习惯把整张表一次性读进内存、同步串行地一个接一个调接口、到处传裸字典、靠 print 调试、用 requirements.txt 锁不住依赖的祖传脚本,系统性地现代化到 Python 3.12 的现代工程体系——这套脚本是公司草创期一个人用几个周末写出来的,功能上一直"能…- 0
- 0
-
从 Python 2.7 + 完全无类型注解全靠猜 + 同步阻塞一请求堵死一线程 + requirements.txt 手工锁版本冲突 + setup.py 打包玄学 + 裸 dict 传数据 key 拼错才炸 + print 当调试 + 无虚拟环境隔离 古老 Python → 2026 Python 3.12 + 完整类型注解 + mypy 严格检查 + asyncio 全异步 + uv 极速依赖 + pyproject.toml 标准打包 + pydantic 数据校验 + dataclass + structlog 结构化日志 + ruff 一体化 现代 Python 体系 87 天战役复盘:47 套工程修法 + 7 个 P0 复盘 + 6 条工程哲学
11 位 Python 平台工程师 87 天把一套跑了八年的古老 Python 2.7 体系——完全没有类型注解全靠猜、同步阻塞一个请求堵死一个线程、requirements.txt 手工锁版本到处冲突、setup.py 打包玄学、到处裸 dict 传数据 key 拼错运行时才炸、print 满天飞当调试、没有虚拟环境隔离——用渐进迁移零停机重构到 2026 年现代 Python 体系:类型注解 …- 2
- 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
-
自建 MCP server 第一周完美第二周崩塌的 4 天复盘:跨用户 auth 泄漏 + cancel 不生效 + 资源竞争三连击根因 + contextvars/two-step confirm 工程纪律落地
MCP server 是 2026 年 AI 工程化的关键基础设施, 但生产化门槛比看起来高得多。本文复盘内部 MCP server 第一周 demo 完美、第二周开放 30 人立刻崩塌的 4 天定位过程: 全局变量保存 user 导致跨用户串号 + httpx 不响应 asyncio cancel 导致僵尸调用 + 共享 asyncpg pool 慢查询拖死快查询三类问题叠加, 最终用 cont…- 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 高并发调用完全指南:从一次"批量任务一上量就 429 刷屏"看懂为什么并发不是越高越快
2024 年我做一个批量分析功能产品攒下了几万条用户评论要给每一条都调一次大模型分析出它的情绪提到的功能点是不是一条有效反馈第一版我做得很顺手写一个循环遍历每一条评论循环体里调一次大模型的 API 把返回的分析结果存进数据库本地我拿几十条评论测了一遍循环顺畅地跑完结果也对我心里很笃定这不就是个循环里调 API 的活儿嘛数据多无非多跑一会儿这批量功能稳了可等我拿真实的几万条数据跑起来一串问题冒了出来…- 2
- 0
-
AI Agent 工具调用编排完全指南:从一次"一个工具异常炸掉整个循环"看懂失败隔离、终止闸与并发调用
2024 年我做一个 AI Agent 要让大模型自己调用一堆工具查数据库搜网页读文件来完成用户交给它的任务。让模型会用工具这件事我压根没多想。第一版我做得很省事 Agent 不就是一个 while 循环把工具列表告诉模型模型说我要调 search 工具我就调把结果拼成一条消息喂回去再问模型模型说完成了循环就结束。本地开发时真不错我问它一个简单问题它调一次工具拿到结果答出来一气呵成。我心里很踏实 …- 0
- 0
-
LLM 调用超时治理完全指南:从一次"一个慢请求挂住、整个服务被拖垮"看懂连接、总超时与取消传播
2024 年我做一个 LLM 应用后端要调用大模型 API 完成问答总结这些活。调用大模型这件事我压根没多想。第一版我做得很省事调用大模型不就跟调用一个普通函数一样把 prompt 发出去等它返回结果拿到就用。本地开发时真不错我点一下请求发出去大模型两三秒就把答案吐回来了顺畅得很。我心里很踏实调 LLM 嘛不就是发个请求等它返回。可等这个应用真正上线被一群真实用户并发地用起来一串问题冒了出来。第一…- 0
- 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
asyncio
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!


















