17611538698
webmaster@21cto.com

Python 更快的并发性取得突破:禁用 GIL 的代码合并

编程语言 0 538 2024-03-14 11:14:57

图片

导读:Python正在向更快的速度前进,它决定革命掉自己的全局解释器锁-GIL特性,这可是它最开始初创的技术特性之一。

近年来,Python不断在革新自己,尤其一些不适合当前软件开发的典型特性,如GIL全局解释器锁。

在Python的官方解释器CPython (该语言的参考实现)中,全局解释器锁(GIL)是一个互斥体,用于保护对 Python 对象的访问,防止多个线程同时执行 Python 字节码。这个锁是必要的,主要是因为CPython的内存管理并不是线程安全的。 

但是,自从 GIL 存在以来,其他功能已经开始依赖于它所强制的软硬件能力,特别是多线程程序,因此越来需要取消此功能。

好消息是,禁用 Python 的 Golal Interpreter Lock (GIL) 的代码在本周已合并到 python:main 中,这实际上对 CPython 已进行了重大更改。

拉取请求在运行 Python 解释器时,添加了对 PYTHON_GIL=0 或 -X gil=0 的支持,前提是它需要使用自由线程编译。 

图片

相关的 PEP(Python 增强提案)是 703,可以让 GIL 在 CPython 中可选。Python技术指导委员会接受了这一建议,并且将在 3.13 中发布,但是“有明确的条件:部署是渐进的,并尽可能少地中断,并且我们可以回滚任何破坏性太大的更改。”

图片

GIL 在不断发展的趋势下成为并发程序的障碍,它阻止多个线程同时运行代码。

PEP 中引用了 DeepMind 的一位工程师的提法:“在我们的许多应用程序中,我们希望每个进程运行 50-100 个线程。然而我们经常看到,即使线程少于 10 个,GIL 也会成为瓶颈。” 解决方法是将此类代码放入本机代码模块中,但这“使得研发人员更难访问这些代码”。

PEP还提到 GIL 使部署人工智能模型的代码变得更加困难,考虑到人们对人工智能软件的兴趣激增,这是一个非常关键的主题。

Python 开发小组成员 Brett Simmers 预计禁用 GIL 将破坏一些现有代码:

“我们预计禁用 GIL 最初会出现很多问题。因此,即使我们的目标是在 3.13 中默认禁用 GIL,我们也可能希望 GIL 默认保持一段时间” 。

Simmers 表示,迫在眉睫的问题之一是“设置 PYTHON_GIL=0 后……尝试在 test_asyncio 中运行完整的测试套件很快会崩溃。”

当前提案背后的主要推动者、Meta 工程师 Sam Gross 表示:

“我们现在应该在自由线程构建中默认启用 GIL(就像现在一样)……我们可以添加 Py_mod_gil 插槽并最终禁用 GIL稍后默认,但希望仍然在 3.13 版本之前。”

支持需要 GIL 扩展的工作也在进行中。上面引用的 Py_mod_gil 槽是一个类变量,可以设置它来指示不需要 GIL,但是根据 PEP 703所述,“如果未设置gil参数,解释器将停止所有线程并在继续之前启用 GIL”。这可能会降低性能,在这些情况下解释器也会发出警告。

综合以上之信息,新的 Python 3.13 版本将包含禁用 GIL 的代码,计划于 2024 年 10 月 1 日正式发布。

作者:校长

评论