Python有望迎来大更新!
早在今年一月份,一份关于将Python中全局解释器锁成为可选的PEP 703提案让Python社区炸了锅,这个被人诟病多年的功能成为每个Python使用者的痛点

就我个人而言,很多时候强行选择多进程达到目的,但多进程间的通信又造成了较大困扰
什么是Python中的全局解释器锁?
简单来说,Python 全局解释器锁(Global Interpreter Lock 或 GIL)是一个互斥锁,它只允许一个线程控制 Python 解释器
这意味着任意时刻只能有一个线程处于执行状态。对于执行单线程程序的开发者来说,GIL 的影响并不明显,但在 CPU 密集型和多线程代码中,它可能成为性能瓶颈
由于 GIL 在多核 CPU 架构中也只允许一个线程执行,它在 Python 中拥有“臭名昭著”的特性
GIL的设计解决了Python什么问题?
在Python中,使用引用计数来进行内存管理,创建的对象有一个引用计数变量,用于跟踪指向该对象的引用数量。当该计数达到零时,该对象占用的内存被释放
但是,引用计数需要防止竞争,即两个线程同时增加或减少其值。如果发生这种情况,可能会导致内存泄漏而永远不会释放,或者更糟糕的是,该对象的引用仍然存在时错误地释放内存,可能会导致 Python 程序崩溃或出现其他“奇怪”的错误
这个引用计数变量可以通过为所有在线程之间共享的数据结构添加锁来确保安全,从而避免不一致的修改
但是,为每个对象或一组对象添加锁意味着会存在多个锁,这可能会导致一个问题——死锁(只有在存在多个锁时才会发生死锁)。另一个副作用是由于重复获取和释放锁而导致的性能下降
GIL 是对解释器本身的单一锁,它增加了一个规则,即执行任何 Python 字节码都需要获取解释器锁。这样可以防止死锁(因为只有一个锁),并且不会引入太多性能开销。但是,它实际上使得任何 CPU 密集型的 Python 程序都变成了单线程执行
了解以上背景后,可以清楚PEP 703提案的目的:
GIL 确实是并发编程的主要障碍。对于科学计算任务而言,这种缺乏并发性通常比 Python 代码执行速度更为严重,因为大部分处理器周期都花费在优化的 CPU 或 GPU 内核中。GIL 引入了一个全局瓶颈,如果其他线程调用任何 Python 代码,可能会阻止它们取得进展。目前在 CPython 中有一些现有方法可以实现并行性,但这些技术都存在重要限制。
PEP 703提议做出什么修改?
PEP 提议向 CPython 添加一个构建配置选项(--disable-gil),以便让它在没有全局解释器锁的情况下运行 Python 代码,并对解释器进行必要的更改以实现线程安全性。
而这份提案也在最近有了最新进展

https://discuss.python.org/t/a-steering-council-notice-about-pep-703-making-the-global-interpreter-lock-optional-in-cpython/30474
CPython核心开发者@Thomas Wouters代表Python指导委员会指出,关于PEP 703提案的民意调查情况来看整体是持积极态度,而Python指导委员会也计划接受提案,目前正在努力研究相关细节,他们将未来方向分为三个阶段:
短期来看,计划在 3.13 版本(如果延后到 3.14,也没关系)中将no-GIL的构建作为实验性构建模式加入进来。我们希望将这个构建模式标记为实验性,以明确表明虽然核心开发人员支持该构建模式,但不能指望社区立刻全力支持它
我们需要时间来弄清楚我们需要做些什么,至少在API设计、打包和分发方面,以便让社区支持它。另外,我们也希望制止发行者将实验性的no-GIL的构建作为默认解释器发布
中期,一旦我们确信社区有足够的支持来实际应用no-GIL的构建,我们将将其设为受支持但暂不设为默认(目前)。然后,我们会设定一个目标日期或Python版本来将其设为默认
具体时间将取决于很多因素,比如API的向后兼容性如何(例如稳定ABI的处理方式),以及社区认为还需要做多少工作。我们预计这可能需要至少一两年,甚至更长时间。一旦宣布支持,我们预计一些发行者可能会开始默认发布no-GIL的版本,不过这可能会受到其他Python包是否支持no-GIL的影响而有很大差异
从长期来看,我们希望no-GIL成为默认设置,并且移除GIL的所有痕迹(同时尽量不破坏向后兼容性)。我们不希望等得太久,因为拥有两种常见的构建方式可能会对社区造成较大负担(例如可能会加倍测试资源和调试场景),但我们也不能仓促行事。我们认为这可能需要长达五年的时间来实现
关于更多PEP 703提案的细节可以参考如下网页,更详细的列举了GIL如何影响人工智能方向的科研人员
https://peps.python.org/pep-0703/
总的来说,如果该提案被正式发布,那么Python可能又将迎来一个大更新,值得期待
以上就是本期全部内容,我是啥都生,下次再见