自由线程Python后时代(2026年Python语言峰会)

自由线程Python后时代(2026年Python语言峰会)

💡 原文英文,约1600词,阅读约需6分钟。
📝

内容提要

2026年Python语言峰会探讨了自由线程Python的“后时代”与高层并发原语。演讲者提出“行为导向并发”(BOC)模型,通过任务和“Cown”互斥锁实现无死锁、无数据竞争,原型bocpy已发布。会议还讨论了是否应标准化单一并发方案,以及async、子解释器与性能安全之间的权衡。

🔎

延伸解读

自由线程的未竟课题:高层并发原语

PEP 779 接受自由线程时,指导委员会明确要求核心团队开始考虑并提议高层并发原语,让用户无需深入理解底层线程机制即可安全使用。本次峰会正是对这一要求的回应。演讲者指出,当前自由线程的接口仍是“线程”,而线程模型要求用户自行处理死锁和竞态条件,这并不理想。因此,讨论焦点转向如何为 Python 提供更安全、更易用的并发抽象。

BOC 模型:用 Cown 和 @when 实现无死锁并发

行为导向并发(BOC)以任务为基础,任务轻量、可运行于任意核心且不会死锁。数据由“Cown”(并发所有者)互斥锁保护,Cown 知晓其保护的数据,确保同一时间仅一个任务访问,从而防止数据竞争。通过 @when 装饰器声明任务依赖的 Cown,调度器可构建依赖图,将潜在死锁或数据竞争提前转为异常。原型 bocpy 已发布,基于子解释器实现,目前仅提供隔离,尚不支持所有权。

性能与安全的权衡:BOC 的现状与局限

演讲者将并发模型置于速度、简单性、安全性三角中,认为高层模型应优先安全,其次性能,简单性第三。bocpy 在简单性上表现良好,安全性方面因运行于稳定 Python 仅实现隔离,所有权需修改运行时才能支持。性能上,对非通信主导的程序表现良好,但子解释器间通信开销较大。团队还有两个修改运行时的概念验证,分别针对隔离堆和对象不可变性(PEP 795),但均需核心 Python 变更。

标准化之争:单一方案还是多元工具?

讨论中,Thomas Wouters 提醒核心团队在统一接口上常有边角案例和性能妥协,对 bocpy 能否避免表示关切。David Hewitt 询问 bocpy 与 async 的关系,Tobias 确认可基于 asyncio 构建,取决于后端权衡。Larry Hastings 欢迎研究,但反对“钦定单一方式”,希望 Python 提供工具让不同竞争方案都能实现。Fridtjof 以 Rust 异步生态分裂为例,警示缺乏标准高层原语可能导致生态被迫收敛于单一运行时。

❓

Q&A

什么是行为导向并发(BOC)?

行为导向并发(BOC)是一种基于任务的并发模型,任务轻量、可在任意核心运行且不会死锁。每个任务拥有受互斥锁保护的数据,这些互斥锁称为“Cown”(并发所有者),能感知所保护的数据,确保同一时间只有一个任务访问,从而防止数据竞争。通过@when装饰器指定任务依赖的互斥锁,形成依赖图,由调度器保证无死锁、无数据竞争和良好的锁纪律。

bocpy是什么?如何安装和试用?

bocpy是BOC模型的一个概念验证实现,基于子解释器,已在Python包索引(PyPI)上发布。可以通过命令“python -m pip install bocpy”安装。它提供了Cown、行为(用@when装饰器生成的任务)和调度器三个特性。目前bocpy在稳定版Python上运行,因此只实现了隔离,尚未实现所有权。

Python在并发方面面临速度、简单性和安全性之间的哪些权衡?

演讲者用速度、简单性和安全性三个轴对比了不同语言的并发实现。C语言快速简单但不安全;Erlang安全简单但性能因数据复制而受损;Rust高性能且安全但不简单(借用检查器复杂)。Python的GIL模型简单但不完全安全;子解释器模型更安全但不简单且性能不佳;自由线程Python类似C,简单且高性能,但将正确性和安全性的负担交给程序员。对于高层模型,演讲者认为应优先考虑安全性,其次是性能,最后是简单性。

自由线程Python的“后时代”指的是什么?

“后时代”指的是自由线程Python项目在PEP 779被接受并取得进展后,需要开始考虑和提出高层并发原语,让用户无需深入理解底层线程机制就能安全有效地使用并发。这是PEP 779接受标准中尚未解决的部分,也是2026年Python语言峰会讨论的主题。

BOC模型如何避免死锁和数据竞争?

BOC模型通过Cown互斥锁和@when装饰器实现。每个Cown保护特定数据,任务只能通过其依赖的Cown访问数据。调度器根据任务和数据的依赖图进行调度,能够提前检测死锁或数据竞争,并将其转化为异常,而不是让程序挂起或产生未定义行为。因此,使用BOC编写的程序不会发生死锁和数据竞争。

Python社区对标准化单一并发方案有哪些讨论?

在峰会上,Larry Hastings表示不希望“钦定单一方式”,以免将Python锁定在特定实现中,他更希望Python提供所有工具,让不同团队实现竞争性想法。Donghee Na澄清小组最初并非要强制单一方式,只是开启对话。Fridtjof以Rust为例,指出不提供高层原语导致生态分裂,而David Hewitt提到Rust社区认为异步情况“略有失败”,因为标准库缺乏标准运行时接口,整个生态被迫收敛到Tokio。Thomas Wouters则担心通用接口的角落案例和性能问题。

bocpy与async/await如何结合?

David Hewitt询问bocpy是否应构建在asyncio之上,并使用异步互斥原语。Tobias回应说bocpy“可以”基于asyncio构建,这取决于后端基础设施和权衡。如果进行I/O操作,可以告诉I/O库在数据可用时将其放入Cown,并调度任务在数据可用时运行,以避免阻塞。

🏷️

标签

➡️

继续阅读