Python 3.12中最大的变化是不是对子解释器(Subinterpreter)的升级?


众所周知,Python是一种解释型语言,特点是:代码在运行时会被Python解释器逐行执行。解释器就是一种直接以高级语言执行脚本而不是将其转换为机器代码的程序。

对单线程代码而言,解释器--主要是CPython--可以完美胜任;但对于多线程而言,解释器会遇到很多挑战。例如:
1)竞态条件。竞态条件是指多个线程尝试同时访问和修改共享数据时可能导致不可预测的结果。
2)数据一致性。当多个线程可以同时修改对象的状态时,导致数据一致性问题。
3)开发复杂度。对于开发人员而言,管理多线程程序的复杂性会显著增加。

对于这些问题,Python解释器选择使用GIL来解决。

GIL是全局解释器锁的缩写。GIL是一个互斥锁,用于控制多线程环境中Python代码的执行。具体来说,它确保在任何给定的时间点,只有一个线程可以执行Python字节码。

GIL的设计主要是出于历史原因和简化Python解释器的目的。它可以防止多线程之间的竞态条件,但也因此带来了一些限制。因为如果只有一个线程可以执行Python代码,那么在多核处理器上,Python程序即使在多线程情况下也无法充分利用所有的核心。

如前所述,CPython是Python的官方解释器,而其使用GIL来控制线程的使用。

子解释器就是CPython中的一个概念,它允许创建多个独立的Python解释器实例,每个实例都有自己的全局状态和资源。

子解释器是CPython的特定功能,其他Python解释器可能没有子解释器的概念或有不同的实现方式。

自Python 1.5 版以来,子解释器一直是 CPython 的一部分,但它们仅作为 C-API 的一部分提供,而不是来自 Python。

Python 3.12 将引入PEP 684。PEP 684 的主要重点是重构 CPython 源代码的内部结构,以便每个子解释器都可以拥有自己的全局解释器锁 (GIL)。

在 PEP 684 之前,所有子解释器都公用一个 GIL,这意味着无论我们创建多少个子解释器,一次只能运行一个。

通过将 GIL 从单个锁转换到每个解释器锁,开发人员将可以充分利用现代计算机中的多核芯片,从而大幅提高 Python 的并行处理能力。

#Python#
展开
评论