导读:历史上的GIL特性是为帮助开发者少走弯路的,如今它却成了性能的瓶颈。在最新的Python中,有意想把它拿下,但是又谈何容易,包括遗留代码,与其它新特性的权衡。
我们回到2003的年初,中央处理器芯片厂商英特尔推出了新款Pentium 4“HT”处理器。该处理器的主频为 3 GHz,并具有当时先进的“超线程”技术。
在接下来的几年里,英特尔和 AMD 通过提高总线速度、二级缓存大小和减小芯片尺寸,以最大限度地减少延迟,来实现最佳台式计算机的性能。
3Ghz HT 于 2004 年被主频高达 4 GHz 的“Prescott”型号 580 取代。似乎获得更好性能的道路是更高的时钟速度,但 CPU 却受到高功耗与地球变暖的热量输出困扰。
现在你的台式机中还有 4Ghz CPU 吗?估计不太可能了,因为提高性能的方法是更高的总线速度和多核心。Intel Core 2 于 2006 年取代了 Pentium 4,但时钟速度要低得多。
除了消费级多核 CPU 的发布之外,2006 年还发生了一件事情:Python 2.5 发布!它捆绑了开发者熟悉并喜爱的 with 语句的测试版。
当使用 Intel 的 Core 2 或 AMD 的 Athlon X2 时,当时的Python 2.5 有一个主要限制,那就是GIL。
from multiprocessing import Process
def f(name):
print 'hello', name
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
p.join()
这样就可以生成新进程,通过编译的 Python 模块或函数发送命令,然后重新加入到主进程。
多进程处理还支持通过队列或管道共享变量。它还存在一个 Lock 对象,用于锁定主进程中的对象,以供其它进程的写入。
但是多处理进程还有一个很大缺陷:就是它在时间和内存使用方面都有很大的开销, CPython 启动时间大概是 100–200 毫秒。
因此,虽然你可以在 CPython 中使用并发代码,但必须仔细规划其应用程序,以适应长时间运行的进程,这些进程之间没有任何共享对象。
还有另一种选择是,像使用 Twisted 这样的第三方包。
如果有更好的方法怎么办呢?
绕过 GIL 的线索就在名字里,全局解释器锁是全局解释器状态的一部分。CPython 进程可以有多个解释器,因此可以有多个锁,但是此功能很少使用,它仅通过 C-API 公开。
CPython 3.8 提出的功能之一是 PEP 554,它是子解释器的实现以及标准库中带有新解释器模块的 API。
这使得能够在单个进程中创建多个Python解释器。
Python 3.8 的另一个变化是解释器都将拥有单独的 GIL —由于解释器状态包含内存分配区域,即指向 Python 对象(本地和全局)的所有指针的集合,因此 PEP 554 中的子解释器无法访问其他解释器的全局变量。
与多处理类似,在解释器之间共享对象的方法是序列化它们,并使用 IPC(网络、磁盘或共享内存)的形式。
Python 中序列化对象的方法有很多种,有 marshal 模块、pickle 模块以及更标准化的方法,如 json 和 simplexml。每一个都有优点和缺点,并且都有开销。
第一个奖励是拥有一个可变的共享内存空间,并由所属进程控制。这样,对象可以从主解释器发送并由其他解释器接收。这将是 PyObject 指针的查找托管内存空间,每个解释器都可以访问该空间,并由主进程控制锁。
好的,这个示例使用的是低级子解释器 API。如果您使用过多处理库,您就会认识到其中的一些问题。它不像线程那么简单,你不能只是说在单独的解释器中使用这个输入列表来运行这个函数(还)。
一旦这个 PEP 被合并,我希望我们会看到 PyPi 中的一些其他 API 采用它们。
__main__ 命名空间和 importlib 中的模块
sys 包含字典
内置函数( print() 、断言等)
线程
核心配置
核心配置可以很容易地从内存中克隆,但导入的模块就没那么简单了。在 Python 中导入模块很慢,因此如果创建子解释器意味着每次都将模块导入到另一个命名空间中,那么优势就会减少。
合并 PEP554 后,很可能在 Python 3.9 中,可以实现替代事件循环实现(尽管还没有人这样做),该实现在子解释器中运行异步方法,因此是并发的。
包括文件句柄属于进程,如果你在一个解释器中打开一个文件进行写入,则子解释器将无法访问该文件。
总体来说,还有不少的其他事情需要解决。
作者:安东尼 ·肖
参考:
https://hackernoon.com/has-the-python-gil-been-slain-9440d28fa93d
本文为 @ 万能的大雄 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。