News Hacker|极客洞察

136 1 小时前 discuss.python.org
😬Python 3.14/3.15 回退增量 GC:生产内存压力与 PEP 争议
没测稳就敢改 GC,这也算发布流程吗?

🎯 讨论背景

这次争论围绕 Python 3.14 的 CPython runtime(Python 主流 C 实现)引入 incremental GC(增量垃圾回收)后出现的生产内存压力,核心开发者因此决定在 3.14 和 3.15 回退到 3.13 的 generational GC(分代垃圾回收)。评论里有人用 memray(Python 内存分析工具)排查到 aiohttp(Python 异步 HTTP 库)客户端反复创建、SSL lib 分配回收滞后等真实案例,说明问题会直接表现成“像内存泄漏一样”的曲线。讨论也延伸到 PEP(Python Enhancement Proposal,Python 改动提案流程)、ptrace(Linux 进程跟踪接口)和运行时 profiling(剖析),因为这些 GC 和调试能力都会影响生产可观测性。更大的背景是 Python 未来是否要继续推进 JIT、free-threading/no-GIL(无 GIL 并发)等更激进的 runtime 变革,以及这会不会让 Python 失去一贯的可预测性。

📌 讨论焦点

生产回归与真实故障

不少人直接给出生产事故的例子,说明 incremental GC 不是抽象争论,而是会把内存曲线推高到像泄漏一样。有人在把服务迁到 Python 3.14 后,用 memray(Python 内存分析工具)排查出问题其实是每个请求都重建 aiohttp 客户端,叠加下游 SSL lib 的释放滞后。最终回滚到 3.13 后问题消失,所以他们只打算等 3.14.5 再试。也有人提到运行时剖析很有用,但在生产环境里常会被 ptrace 权限限制住。

[来源1] [来源2] [来源3]

GC 改动应走 PEP 且充分测试

很多评论质疑这类改动为什么能不经过 PEP 就进入主线,因为它虽然不改语法,却会显著改变进程的内存和 CPU 行为。有人认为问题不在于回退本身,而在于把一个有明显回归的版本先发出去,说明对核心组件的测试不够。也有人强调这是 CPython runtime 的改动,不是语言层面的变化,但正因为如此,更需要透明的提案流程来约束。还有人推测后面可能会补一个 PEP,只要性能和稳定性能达标。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7]

可预测性优先于激进优化

不少 Python 用户把“可预测”看得比“更快”更重要,担心 JIT 和变化中的 GC 会让 Python 变成需要频繁调参的系统。有人直接建议想要 JIT 就用 PyPy,但也指出 PyPy 的生态支持不足,而且还卡在 3.11。另一边,有人拿 Go、Java 和 .NET 对比,认为现代 GC 通过默认值和 telemetry 把不可预期的暂停压得更低;也有人反驳说 Java 现在其实已经只剩很少的 knobs。有人还提到 Jython 和 GraalVM(JVM 上的 Python 方案),但前者早已停滞,后者又受 Oracle 生态约束。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11] [来源12] [来源13] [来源14]

free-threading 与 no-GIL 的误解

有评论把这次 GC 回退和 Meta 推动的 no-GIL / free-threading 混在一起,认为大公司一施压,Python 的问题就会被放大到全社区。随后有人澄清,这次 incremental GC 和 free-threading 是两条不同路线,后者甚至使用自己的独立 GC 设计。这个分歧也反映出大家对 Python 未来 runtime 演进的不安:一边是提升并发的诉求,一边是担心每次大改都先在生产里挨一轮。

[来源1] [来源2]

AI 时代的语言选择与 Python/Go 争论

AI 生成代码并没有让 Python 的运行特性变好,于是一些人开始用“性能”和“可读性”重新审视 Python 是否还适合作为默认选择。有人说把大规模代码迁到 Go 后,性能和维护体验都明显改善;也有人反驳,团队最终还是要对生成的代码负责,语言是否易读很大程度取决于熟悉度和习惯。围绕这一点,评论区出现了典型分歧:有人觉得 Go 的约束更利于排查复杂系统,有人则认为 Python 更直观,而且普及度更高。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10]

📚 术语解释

incremental GC: 把垃圾回收拆成更小的增量步骤执行,目标是减少单次停顿。

generational GC: 按对象“代际”分组回收,通常更偏向频繁处理年轻对象。

PEP: Python Enhancement Proposal,Python 改动和标准化的正式提案流程。

JIT: 即时编译,在运行时把代码编译成更快的机器码。

PyPy: Python 的替代解释器,主打 JIT 和不同的运行时实现。

free-threading/no-GIL: 去掉 GIL 以提升多线程并发能力的 Python 运行模式。