为什么Java虚拟机中没有GIL?为什么Python需要这么糟糕?

时间:2009-06-14 01:12:56

标签: java python multithreading jvm gil

我希望有人可以提供一些有关Java虚拟机根本不同的见解,它允许它很好地实现线程,而不需要全局解释器锁(GIL),而Python需要这样的邪恶。

5 个答案:

答案 0 :(得分:218)

Python(该语言)不需要GIL(这就是为什么它可以完美地在JVM [Jython]和.NET [IronPython]上实现,以及那些实现多线程的实现)。 CPython(流行的实现)总是使用GIL来简化编码(尤其是垃圾收集机制的编码)以及非线程安全的C编码库的集成(过去常常有大量的; - 。)

Unladen Swallow项目,以及其他雄心勃勃的目标,plan用于Python的无GIL虚拟机 - 引用该网站,“此外,我们打算删除GIL并修复Python中的多线程状态。我们相信这可以通过实现更复杂的GC系统实现,例如IBM的Recycler(Bacon et al,2001)。“

答案 1 :(得分:48)

JVM(至少是热点)确实有与“GIL”类似的概念,它的锁粒度更加精细,其中大部分都来自GC中的更高级的热点。

在CPython中它是一个很大的锁(可能不是那么真实,但足以说明论证),在JVM中,根据它的使用位置,它会更多地传播不同的概念。

例如,在热点代码中查看vm / runtime / safepoint.hpp,这实际上是一个障碍。一旦处于安全点,整个VM就java代码而停止,就像python VM在GIL停止一样。

在Java世界中,这种VM暂停事件被称为“stop-the-world”,在这些点上,只有绑定到某些条件的本机代码才能自由运行,其余的VM已经停止。

java中缺少粗略锁定使得JNI编写起来要困难得多,因为JVM对FFI调用的环境提供的保证较少,cpython使得相当容易的事情之一(虽然不像使用ctypes那么容易) )。

答案 2 :(得分:6)

在这篇博客文章http://www.grouplens.org/node/244下面有一条评论,暗示为什么它容易为IronPython或Jython免除GIL,这是CPython使用引用计数,而其他2个VM有垃圾收集者。

为什么会这样的确切机制我不明白,但这听起来似乎是一个合理的理由。

答案 3 :(得分:0)

在此link中,他们有以下解释:

...“解释器的各个部分不是线程安全的,但主要是因为通过大量锁定使用使它们全部线程安全会使单线程极其缓慢(source)。这似乎与CPython垃圾有关使用引用计数的收集器(JVM和CLR没有,因此不需要每次都锁定/释放引用计数。)但即使有人想到一个可接受的解决方案并实现它,第三方库仍然会有同样的问题。“

答案 4 :(得分:-2)

Python缺少jit / aot,并且在多线程处理器上编写的时间框架不存在。或者,您可以重新编译Julia lang中缺少GIL的所有内容,并在Python代码上获得一些速度提升。另外Jython很糟糕,它比Cpython和Java慢。如果你想坚持Python考虑使用并行插件,你将无法获得即时速度提升,但你可以使用正确的插件进行并行编程。