如果 Python 4.0 摆脱了 GIL…

作者:orenwang , 腾讯IEG应用开发工程师
| 导语 GIL , 即全局解释器锁 , 是阻碍 Python/ target=_blank class=infotextkey>Python 多线程并发计算性能提升的最大原因 , 也是众多 Python 开发者的心头之痒 , 而 Sam Gross 大神的新项目 nogil 却在过去几个月的时间里硬生生地撬开了这把锁 。
There should be one- and preferably only one -obvious way to do it.
- Zen of Python
1992年的一天 , Python 之父 Guido van Rossum 为 Python 引入了一种简单而又优美的机制:让程序运行无需再担心死锁 , 因为全局只有一把锁;功能实现更加简洁 , 无需再针对单个对象加锁和解锁 , 因为全局只有一把锁;甚至大幅提高了计算速度 , 这来源于程序本身的低 Overhead 和独特的 Garbage Collection 机制 , 因为全局只有一把锁 。这把锁就是 GIL , 即全局解释器锁 。
我们快进到1998年 , 硬件行业在这一年发生了一个重要的变化:多核处理器被研制出来了 。大家很快意识到 GIL 在单线程领域的强大 , 却成为了多核计算时代的绊脚石 。因此在1999年 Python 1.4 版本期间出现了一个叫 "free-threading" 的包 , 大刀阔斧地移除了 GIL , 然而单线程计算速度却慢了4到7倍 。
而我所知道的最近一次移除 GIL 的尝试是 2016 年 Larry Hastings 大神提出的 Gilectomy 项目 , 其移除了 GIL 之后单线程计算仅慢了 30% , 然而该项目的主要问题在于核越多 , 计算越慢(7核下慢19倍) 。
由此可见 , Guido 爸爸写的这段代码 , 尽管每天被全球开发者吐槽 , 但真搞起来 , 想比人家做得更好并不容易 。
GIL 的问题
举一个简单的例子:给你一张纸 , 上面有100个格子 , 让你从数字1写到100 , 一个格子一个数字 , 你觉得需要多久?我闲来试了一下 , 花了我82秒(好像真的很闲) 。那好 , 现在假设你们有五个人 , 每个人只要写其中20个数字即可 , 你觉得需要多久?简单地看 , 82秒除以5 , 五个人大约16秒即可完成 。但如果你们五个人只有一支笔呢?算上你们互相传递笔的时间 , 恐怕82秒也不够了 。

如果 Python 4.0 摆脱了 GIL…

文章插图
 
纸上画数字的例子(动画内可以想象成100个人+100支笔同时写字)
上面的例子里 , 这支笔 , 在 Python 的世界里就是 GIL:无论你们有多少人 , 只能有一个人拿着笔 , 其他人只能等着这个人把笔放下 , 才能开始写字;无论你的 Python 程序起了多少个线程 , 真正吃 CPU 干活的只有一个线程 。之所以这里强调了一下吃 CPU , 是因为 GIL 的设计仅对 CPU-bound 的程序有限制 , 而在处理 IO-bound 计算时 , 是不需要 GIL 这支笔的 , 大家可以同时干 I/O 的活 。
这时很多人会好奇 , 为什么不直接使用 multiprocessing 库进行多进程计算呢?当然可以 , 但是 multiprcessing 的实现实际上是"fork"了个新的进程 , 性能牺牲了不说 , 死锁的问题也将会暴露出来 , 更不用说如 CUDA 等很多第三方库是不支持“fork”的 。
再说一点 , 实际上 , 大部分人吐槽 GIL 的点 , 并非是 Python 程序本身并发效率的问题 , 而是大多数对于计算速度有要求的库都是 Python 调用 C/C++ , 而 GIL 限制了你在调用 C/C++ 时也只能真正同时运行一个线程 。也难怪 Sam 大神想要移除掉 GIL , 他作为 PyTorch 的核心作者 , 自称因性能问题曾大面积地把 Python 代码完全重写成了 C/C++  , 也因此很多人说 PyTorch 跟 Python 关系已经不大了 。相比之下 , Swift 团队曾写过一篇 “Why Swift for Tensorflow” 点出了相比 Python 的 GIL 性能瓶颈 ,  Swift 在训练 AI 的性能方面具备优势;而Python 的第一竞品 Julia 开发者和爱好者们更是揪着 GIL 这一点屡屡不放手 , “怂恿”大家转向使用 Julia 做数据科学工作 。
综上 , 现今 GIL 怕是过大于功了 。
一些不那么基础的基础知识
接下来 , 本文会讲解一些技术细节 , 虽然尽可能写得通俗易懂(从而不暴露自己其实也不懂) , 但如果不够熟悉 Python 的话可能还是会觉得有些不知所云...


推荐阅读