为什么Java虚拟机中没有GIL?为什么Python如此需要一个呢?

为什么Java虚拟机中没有GIL?为什么Python如此需要一个呢?,java,python,multithreading,jvm,gil,Java,Python,Multithreading,Jvm,Gil,我希望有人能提供一些见解,了解Java虚拟机的本质区别是什么,它允许它在不需要全局解释器锁(GIL)的情况下很好地实现线程,而Python需要这样一个邪恶的东西。Python(语言)不需要GIL(这就是为什么它可以完美地在JVM[Jython]和.NET[IronPython]上实现,并且这些实现可以自由地使用多线程)。CPython(流行的实现)一直使用GIL来简化编码(特别是垃圾收集机制的编码)和集成非线程安全的C代码库(过去周围有很多这样的人;-) 该项目,在其他雄心勃勃的目标中,为Pyt

我希望有人能提供一些见解,了解Java虚拟机的本质区别是什么,它允许它在不需要全局解释器锁(GIL)的情况下很好地实现线程,而Python需要这样一个邪恶的东西。

Python(语言)不需要GIL(这就是为什么它可以完美地在JVM[Jython]和.NET[IronPython]上实现,并且这些实现可以自由地使用多线程)。CPython(流行的实现)一直使用GIL来简化编码(特别是垃圾收集机制的编码)和集成非线程安全的C代码库(过去周围有很多这样的人;-)

该项目,在其他雄心勃勃的目标中,为Python开发了一个无GIL的虚拟机——引用该网站的话,“此外,我们打算删除GIL并修复Python中的多线程状态。我们相信,通过实现更复杂的GC系统,比如IBM的Recycler,这是可能的(Bacon等人,2001年)。”

JVM(至少是热点)的概念与“GIL”类似,只是它的锁粒度要细得多,其中大部分来自更高级的热点中的GC

在CPython中,它是一个大锁(可能不是那么正确,但为了参数的缘故,它已经足够好了),在JVM中,它更多地使用不同的概念,这取决于它的使用位置

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

在Java世界中,这种VM暂停事件被称为“停止世界”,在这一点上,只有绑定到特定条件的本机代码是自由运行的,VM的其余部分已经停止


java中缺少粗锁也使得JNI的编写更加困难,因为JVM对其FFI调用环境的保证较少,而cpython使这一点变得相当容易(尽管不如使用ctypes那么容易).

这篇博文下面有一条评论,暗示了为什么IronPython或Jython很容易不用GIL,这是因为CPython使用引用计数,而其他两个VM都有垃圾收集器


我不明白为什么会这样,但这听起来似乎是一个合理的原因。

Python缺少jit/aot,并且它在多线程处理器上编写的时间框架不存在。或者,你可以在Julia lang中重新编译缺少GIL的所有内容,并在Python代码上获得一些速度提升。Jython也有点差劲它比CPython和java慢。如果你想使用Python考虑使用并行插件,你将不能获得即时的速度提升,但是你可以用正确的插件进行并行编程。

< P>
…“解释器的某些部分不是线程安全的,尽管主要是因为通过大量使用锁使它们都是线程安全的会极大地降低单线程的速度()。这似乎与使用引用计数的CPython垃圾收集器有关(JVM和CLR没有,因此不需要每次锁定/释放引用计数).但是,即使有人想到了一个可接受的解决方案并实施了它,第三方库仍然会有同样的问题。”

Alex,那么以前删除GIL的尝试会有怎样的结果呢?这不是有很多开销吗(我记得是2的一个因素)?是的,Bartosz,Greg Stein在1999年确实测量了这一点。通过引用计数进行垃圾收集是杀手锏,导致细粒度锁定的巨大开销。这就是为什么更高级的GC在那里至关重要的原因。Unladen Swallow团队已经放弃移除GIL:Unladen和CPython的替代品是PyPy、Jython和IronPython。后两个没有“没有GIL,但使用多处理模块会避开GIL,而且更安全。当您在线程之间随意共享对象时,计算出没有人对特定对象有引用时会有点尴尬。使用全局锁进行引用计数是一个(昂贵的)另一种解决方法是,一次只让一个线程保存对对象的引用,这将使大多数活动都是线程本地的,而代价是使线程间的通信更加困难。就我个人而言,我认为这说明HPC使用处理器之间的消息传递而不是共享内存,而且它是这样做的或者可伸缩性原因…嗯,基本上,有两种类型的垃圾收集:标记和清除(或停止和清除,或者不管这种方法的具体实现如何调用)和引用计数因此,Java在同步ref计数器时会遇到与python相同的问题?PyPy呢?