Python 3.2 - GIL - 好与坏?

21 投票
3 回答
12907 浏览
提问于 2025-04-16 02:10

Python 3.2 ALPHA 发布了

从更新日志来看,GIL(全局解释器锁)已经被完全重写了。

有几个问题:

  1. 有GIL是好事还是坏事?(为什么?)
  2. 新的GIL更好吗?如果是的话,具体好在哪里?

更新:

我对Python还比较陌生,所以这些对我来说都是新鲜事,但我至少明白GIL在CPython中是个大问题。

不过我有个疑问,为什么CPython不直接像Perl那样克隆解释器,以此来去掉GIL的需求呢?

3 个回答

1

新的全局解释器锁(GIL)更好吗?如果是的话,怎么更好了?

至少它把原来的操作计数方式换成了时间计数方式。这并不会提高整体性能(甚至可能因为更频繁的切换而降低性能),但这样做让线程的反应更灵敏,也避免了当一个线程在执行计算量大的操作时,所有线程都被锁住的情况(比如调用一个不释放GIL的外部函数)。

为什么CPython不直接像Perl那样克隆解释器,以试图去掉GIL呢?

GIL是个复杂的问题,不应该被视为绝对的坏东西。它给我们带来了线程安全。

至于Perl,Perl一方面已经不再流行,另一方面也太老了。谷歌的团队正在努力把LLVM的一些好东西引入CPython,这其中会改善GIL的表现(不过还没有完全去掉GIL):http://code.google.com/p/unladen-swallow/

4

有全局解释器锁(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的线程模型本质上是不同的。

25

我看到的关于为什么全局解释器锁(GIL)不好用的最佳解释在这里:

http://www.dabeaz.com/python/GIL.pdf

同一个人还有一个关于新GIL的演示在这里:

http://www.dabeaz.com/python/NewGIL.pdf

如果仅仅是这些改动,那它还是不好用——只是没那么糟糕。多个线程的表现会更好一些。但对于单个Python应用来说,多核处理器还是没什么用。

撰写回答