Python 新提案:使全局解释器锁成为可选项


去年的2022 Python 语言峰会上,开发者 Sam Gross 带来了新提案:删除全局解释器锁 GIL,解放多线程性能。但由于 GIL 历史悠久,许多官方/非官方的 Python 包和模块都深度融合了 GIL 模块,彻底移除 GIL 功能可能会对生态造成影响。在 2023 年 1 月 9 日, Sam Gross 又创建了另一个 Python 提案 PEP 703:使全局解释器锁成为构建 Python 的可选项。

CPython 的全局解释器锁(“GIL”)防止多个线程同时执行 Python 代码,GIL 是 Python 有效使用多核 CPU 的障碍。

向 CPython 添加一个构建配置 ( --without-gil) ,使其可在没有全局解释器锁的情况下运行 Python 代码,并进行必要的更改,以使解释器线程安全。

这条 PEP 提案的内容可谓是论文级别。提案中先阐述了 GIL 对 Python 并发的性能阻碍,随后详细分析了抽离 GIL 需要对 Python 内部进行哪些改动:

移除全局解释器锁需要对 CPython 内部进行大量更改,但对公共 Python 和 C API 的更改相对较少。

实施的变更大约分为以下四类:

引用计数、内存管理、容器线程安全、锁和 atomic API

由于该提案内容实在太多,感兴趣的朋友请在 PEP 703 详情页和 Cpython 核心开发者对该提案的讨论帖中细阅。

目前此 PEP 已经有了参考实现,它的原型源于当初为了移除 GIL 而开发的 nogil 项目,该原型对单线程代码带来较明显 (~10%) 性能提升。

如果该提案通过,意味着默认情况下 CPython 不会删除或关闭 GIL,也不会让用户有选择地启用/删除 GIL。因为--without-gil是一个编译时标志,可以在从源代码构建 Python 解释器时进行设置。但如果弃用该配置,会导致对解释器的构建和运行方式的深度侵入性更改,PEP 中也对此进行了详细介绍。

对用户侧来说,该改动意味着如果用户使用任何带有编译扩展的包,将需要获取或构建一个专门针对 Python 解释器的(不同的)ABI 编译的版本,该版本在没有 GIL 的情况下编译。

关于 Python GIL 

由于 CPython 的内存管理非线程安全,因此设计了 CPython 的 GIL (Global Interpreter Lock - 全局解释器锁),以防止竞争条件并确保线程安全。 GIL 是一个互斥锁,只允许一个线程持有 Python 解释器的控制权,从而保护对 Python 对象的访问,防止多个线程同时执行 Python 字节码。 

但事后看来,GIL 并不理想,因为它阻止了多线程的 CPython 程序充分利用多核处理器的性能。


相關推薦

2023-07-11

的是 Making the Global Interpreter Lock Optional in CPython,让全局解释器锁在 CPython 中成为可选。 该提案建议向 CPython 添加构建配置 (--disable-gil),使其在没有全局解释器锁的情况下运行 Python 代码,并进行必要的更改以保证解释器线程

2023-10-27

。 PEP 703(Making the Global Interpreter Lock Optional,让全局解释器锁成为可选),简称 no-GIL,也被称为自由线程 (free-threaded)。 根据提案的描述,CPython 的全局解释器锁 (GIL) 阻止了同时多线程执行代码,成为了在多核 CPU 上

2022-05-18

2022 Python 语言峰会上带来了一个新提案:完全移除 CPython 解释器的 GIL- 全局解释器锁,使 Python 程序获得更快的性能 —— 尤其是多线程程序。 Python 有多个版本,包括 JVM 、 .NET CLR  解释器以及编译器,但该语言的核心实现

2022-05-19

快的运行时,这些优化大部分来自于 PEP 659  :自适应解释器,它运作思路跟 JIT 有点相似,都是识别热点代码,但自适应解释器的工作范围无法脱离字节码。目前 PEP 659 提案的工作基本完成,但 for 循环和二进制操作的动态

2023-04-11

了 CPython,允许开发者在一个进程中同时运行多个 Python 解释器。然而,多个解释器在同一进程中运行时,并不能真正地相互隔离。同一进程中的解释器始终共享大量全局状态。这是很多错误的来源,随着越来越多的人使用该功

2023-04-12

下:它不是预构建的 Python 软件包,而是预构建的 Python 解释器。 此提案定义了一个标准的打包文件格式来保存预构建的 Python 解释器,并尽可能重用现有的 Python 打包标准。 命名格式:{distribution}-{version}[-{build tag}]-{platform tag}

2023-05-06

I 基础设施公司 Modular AI 最近发布的编程语言,它结合了 Python 的语法以及 C 语言的可移植性和性能,目标是使其成为 AI 研究和生产的理想选择。 根据介绍,Mojo 不仅兼容 Python,还比它快 35000 倍。详情查看:AI 开发有了新编程

2023-10-04

的 debugging/profiling API (PEP 669) 支持具有单独全局解释器锁的分离子解释器 (PEP 684) 优化性能,例如 PEP 709 和对 BOLT 二进制优化器的支持,预计总体性能提高 5%。 改进错误信息 支持 Linux perf 分析器在跟踪过程中报

2023-10-26

1 和 Python 3.12 这两个版本中,Python 核心开发团队对 Python 解释器的参考实现 CPython 进行了一系列变革性升级。其结果是,Python 运行时性能对所有人来说都实现了大幅提升,而不仅限于那些选择使用新库或 cutting-edge 语法的少数人

2023-04-01

Python 指导委员会拒绝了 PEP 582 提案——Python local packages directory,即本地包目录。 此 PEP 提议向 Python 添加一种自动识别__pypackages__目录的机制,并优先导入安装在此位置的包,而不是用户或全局站点包。这将避免创建、激活或

2023-04-20

是可执行脚本开头的字符序列,用于定义要运行的程序的解释器。当 Unix 内核的程序加载器执行 JavaScript 程序时,主机会剥离 hashbang 以生成有效源,然后再将其传递给引擎。Hashbang Grammar 提案标准化了它的完成方式。   #!/u

2023-05-25

Linux、Windows、macOS 等。它还提供了多种语言的绑定,如 Python、Ruby、Perl 等,使得开发人员可以方便地在自己喜欢的编程语言中使用它。 也正是因为使用了 libarchive 提供的开源解决方案,Windows 11 还将支持 tar、gz 等许多其他格

2022-07-30

下内容: Python 3.11 支持 HTTP 客户端 用于设置远程解释器的新 UI 运行当前文件 对 PyScript 的初始支持 Jupyter 笔记本 数据库管理 Docker 优化 Python 3.11 PyCharm 2022.2 为 Python 3.11 的一些主要功能配备了代码洞察力,例如

2023-04-15

OpenJDK 的 JEP 445 提案正在努力简化 Java 的入门难度。这个提案主要是引入“灵活的 Main 方法和匿名 Main 类” ,希望 Java 的学习过程能更平滑,让学生和初学者能更好地接受 Java 。 提案的作者 Ron Pressler 解释:现在的 Java