Python创造者Guido Van Rossum的这篇文章提到了从Python中删除GIL的早期尝试:
以前曾尝试过这种方法,但结果令人失望,这就是为什么我自己不愿意为此付出很多努力的原因。在1999年,Greg Stein(与Mark Hammond合作)生产了Python的一个fork(我相信是1.5),它删除了GIL,并用所有可变数据结构上的细粒度锁代替了它。他还提交了补丁,删除了许多我对全局可变数据结构的依赖。但是,在进行基准测试后,结果表明,即使在具有最快锁定原语的平台(当时为Windows)上,单线程执行的速度也降低了近两倍,这意味着在两个CPU上,您可以多做一点工作在没有GIL的情况下比在具有GIL的单个CPU上完成。这还不够,格雷格的补丁消失了。(请参阅格雷格关于演出的文章。)
我很难与实际结果争论,但我真的很奇怪为什么会这样。大概,从CPython中删除GIL如此困难的主要原因是由于引用计数内存管理系统。一个典型的Python程序将调用Py_INCREF
和Py_DECREF
数千或数百万次,使其成为一个关键的竞争点,如果我们要环绕它锁。
但是,我不明白为什么添加原子基元会降低单个线程程序的速度。假设我们刚刚修改了CPython,以便每个Python对象中的refcount变量是一个原子基元。然后,当我们需要增加引用计数时,我们只是执行原子增加(获取和添加指令)。这将使Python参考计数线程安全,并且在单线程应用程序上不应有任何性能损失,因为不会发生锁争用。
但是,a,许多比我聪明的人都尝试过并且失败了,所以显然我在这里缺少任何东西。我看这个问题的方式有什么问题?