Python 3.2 - GIL - 好与坏?
Python 3.2 ALPHA 发布了。
从更新日志来看,GIL(全局解释器锁)已经被完全重写了。
有几个问题:
- 有GIL是好事还是坏事?(为什么?)
- 新的GIL更好吗?如果是的话,具体好在哪里?
更新:
我对Python还比较陌生,所以这些对我来说都是新鲜事,但我至少明白GIL在CPython中是个大问题。
不过我有个疑问,为什么CPython不直接像Perl那样克隆解释器,以此来去掉GIL的需求呢?
3 个回答
新的全局解释器锁(GIL)更好吗?如果是的话,怎么更好了?
至少它把原来的操作计数方式换成了时间计数方式。这并不会提高整体性能(甚至可能因为更频繁的切换而降低性能),但这样做让线程的反应更灵敏,也避免了当一个线程在执行计算量大的操作时,所有线程都被锁住的情况(比如调用一个不释放GIL的外部函数)。
为什么CPython不直接像Perl那样克隆解释器,以试图去掉GIL呢?
GIL是个复杂的问题,不应该被视为绝对的坏东西。它给我们带来了线程安全。
至于Perl,Perl一方面已经不再流行,另一方面也太老了。谷歌的团队正在努力把LLVM的一些好东西引入CPython,这其中会改善GIL的表现(不过还没有完全去掉GIL):http://code.google.com/p/unladen-swallow/
有全局解释器锁(GIL)是好是坏?(为什么?)
其实都不是,也可以说是两者都有。GIL是为了让线程之间能够同步,也就是保证它们不会同时去干扰同一块数据。
新的GIL更好吗?如果是,怎么个好法?
你有没有做过性能测试?如果没有,那你应该先(1)做一个性能测试,(2)把测试结果放到问题里,(3)问一些关于测试结果的具体问题。
模糊地讨论GIL基本上是浪费时间。
不过,如果在你性能测试的具体背景下讨论GIL,可能会找到解决你性能问题的方法。
有个问题,为什么CPython不直接像Perl那样克隆解释器来试图去掉GIL呢?
你可以看看这个链接:http://perldoc.perl.org/perlthrtut.html
首先,Perl最开始根本不支持线程。早期的Perl解释器有一个有问题的模块,运行不正常。
其次,新的Perl解释器现在有这个功能了。
Perl的ithreads和旧的5.005风格的线程,或者说大多数其他线程系统之间最大的区别在于,默认情况下,没有数据是共享的。当创建一个新的Perl线程时,当前线程的所有数据都会被复制到新线程中,并且这些数据对新线程是私有的!
因为Perl(只有特定数据是共享的)模型和Python(所有数据都是共享的)模型是不同的,克隆Perl解释器会从根本上破坏Python的线程。Perl的线程模型本质上是不同的。
我看到的关于为什么全局解释器锁(GIL)不好用的最佳解释在这里:
http://www.dabeaz.com/python/GIL.pdf
同一个人还有一个关于新GIL的演示在这里:
http://www.dabeaz.com/python/NewGIL.pdf
如果仅仅是这些改动,那它还是不好用——只是没那么糟糕。多个线程的表现会更好一些。但对于单个Python应用来说,多核处理器还是没什么用。