我希望有人能提供一些洞察力,说明Java虚拟机有什么根本的不同,它允许它很好地实现线程,而不需要全局解释器锁(GIL),而Python需要这样的邪恶。
发布于 2009-06-14 01:20:56
Python (这种语言)不需要GIL (这就是为什么它可以在JVM、Jython和.NET IronPython上完美地实现,并且这些实现可以自由地多线程)。CPython (流行的实现)一直使用GIL来简化编码(特别是。垃圾收集机制的编码)和非线程安全的C编码库的集成(过去有很多这样的库;-)。
在其他雄心勃勃的目标中,Unladen Swallow项目确实plan了一个用于Python的无GIL虚拟机--引用该站点的话说,“此外,我们打算移除GIL并修复Python中的多线程状态。我们相信,通过实现一个更复杂的GC系统,这是可能的,就像IBM的Recycler一样(Bacon et al,2001)。”
发布于 2009-07-22 01:27:17
JVM (至少hotspot)确实有类似于"GIL“的概念,只是它的锁粒度更细,其中大部分来自hotspot中更高级的GC。
在CPython中,它是一个很大的锁(可能不是那么正确,但对于参数来说已经足够好了),在JVM虚拟机中,它更多地是通过不同的概念传播的,具体取决于它的使用位置。
例如,看看hotspot代码中的vm/ the /safepoint.hpp,这实际上是一个障碍。一旦到达安全点,整个VM就停止了java代码,就像python VM在GIL停止一样。
在Java世界中,这样的VM暂停事件被称为“停止世界”,在这些点上,只有绑定到特定条件的本机代码是自由运行的,VM的其余部分已经停止。
此外,java中缺少粗锁使得JNI更难编写,因为JVM对其FFI调用环境的保证较少,这是cpython使之相当容易的事情之一(尽管不像使用ctype那么容易)。
发布于 2010-04-13 05:45:11
在这篇博文http://www.grouplens.org/node/244下面有一条评论,暗示了为什么在IronPython或Jython上这么容易省去GIL的原因,那就是CPython使用引用计数,而其他两个VM都有垃圾收集器。
我不明白为什么会这样的确切机制,但这听起来确实是一个合理的理由。
https://stackoverflow.com/questions/991904
复制相似问题