六星源课堂:2022年 Python 语言峰会—没有 GIL 的 Python!
关于python GIL的话题已经被社区讨论了无数遍了,最近在2022年语言峰会上山姆·格罗斯他向与会者介绍了 nogil(项目名称很有意思,直译: 没有gil,真直接) 的最新情况,该项目于 2021 年 10 月首次宣布时席卷了 Python 社区。
GIL 或“全局解释器锁”是 Python 防止线程之间真正并发的关键特性,即在只运行一个 Python 进程时很难同时执行多个任务。以前移除 GIL 的主要带头人是拉里·黑斯廷斯,他的著名“Gilectomy”项目。Gilectomy 项目最终被放弃,因为它使单线程 Python 代码变慢。
在会上山姆·格罗斯介绍了nogil项目的进展情况,目前已选择 3.9 作为目标,因为达到早期采用水平对于判断整个项目是否可行非常重要。如果第三方包在使用 nogil 时不起作用,早期采用者将无法有效地使用该项目。与 Python 3.10 相比,第三方包对 Python 3.9 的支持仍然更广泛,因此 Python 3.9 作为基础分支目前仍然比 3.10 或主分支更有意义。
山姆·格罗斯介绍的另一个更新是他在线程安全方面做出了改变。为了使 Python 在没有 GIL 的情况下有效地工作,许多代码需要添加新的锁以确保它仍然是线程安全的。然而,向现有代码添加新锁可能非常困难,因为在某些领域可能会出现大幅减速。格罗斯的解决方案是发明一种新型锁,一种“更吉利”的锁。
山姆·格罗斯这次还带来一个提议,在 Python 3.12 中引入一个新的编译器标志,该标志将禁用 GIL,格罗斯的提议受到了聚集的核心开发人员的兴奋和强烈质疑,Carol Willing 质疑 nogil 继续作为 CPython 的一个独立分支是否更有意义,而不是让 Gross 旨在将他的工作合并到 CPython 本身的主要分支中。然而,格罗斯回应说,这“不是通往成功的道路”。
pydantic 库的维护者 Samuel Colvin 对新提案是针对编译器标志而不是运行时标志表示失望。Colvin 评论说:“如果可以从 Python 内部更改设置,我不禁想到采用水平会大大提高”。
Barry Warsaw 和 Itamar Ostricher 都向 Gross 询问了如果他们想要支持新模式,nogil 可能对第三方库产生的影响。Gross 回应说,对许多库的影响是微乎其微的——对像 scikit-learn 这样的库完全没有影响,numpy 可能只有 15 行代码。Gross 说,科学图书馆对 Gross 产生了相当大的兴趣,因此相信构建单独的 C 扩展以支持 nogil 模式的压力不会过于沉重。Carol Willing 鼓励 山姆·格罗斯 参加科学计算会议,收集更多反馈。
与会者还非常关注 nogil 的引入可能对 CPython 开发产生的影响。一些人担心引入 nogil 模式可能意味着在 CI 中运行的测试数量必须翻倍。其他人担心如果同时支持两个不同版本的 CPython,维护负担会增加:一个带有 GIL,一个没有。
总的来说,在场的人对诺吉尔模式还是有很大的兴奋和好奇的。然而,关于该项目的后续步骤的重大问题仍未解决。
本次分享就到这里了,关于python更多技巧跟疑问,请移步六星源课堂解答~