Python的全局解释器锁的功能到底是什么?其他被编译成字节码的语言是否采用了类似的机制?
发布于 2008-11-05 16:44:11
通常,对于任何线程安全问题,您都需要使用锁来保护内部数据结构。这可以通过不同级别的粒度来完成。
每种方法都有不同的优缺点。细粒度锁定允许更大的并行性--两个线程在不共享任何资源时可以并行执行。然而,行政管理费用要大得多。对于每一行代码,您可能需要获取和释放几个锁。
粗粒度方法正好相反。两个线程不能同时运行,但是单个线程会运行得更快,因为它没有做那么多的簿记工作。最终,它归结为在单线程速度和并行性之间的权衡。
有几次尝试删除python中的GIL,但是单线程计算机的额外开销通常太大。由于锁争用,有些情况下即使在多处理器机器上也可能会慢一些。
其他被编译成字节码的语言是否采用了类似的机制?
它是不同的,它可能不应该被视为语言属性,而应该被视为实现属性。例如,有一些Python实现,比如Jython和IronPython,它们使用底层VM的线程方法,而不是GIL方法。此外,下一个版本的Ruby看起来正在移动奔向引入一个GIL。
发布于 2008-11-05 16:32:37
以下是来自官方Python/C API参考手册的
Python解释器并不完全是线程安全的。为了支持多线程Python程序,在安全访问Python对象之前,当前线程必须持有一个全局锁。没有锁,即使是最简单的操作也可能在多线程程序中造成问题:例如,当两个线程同时增加同一对象的引用计数时,引用计数可能只增加一次而不是两次。 因此,只有获得全局解释器锁的线程才能操作Python对象或调用Python/ call函数。为了支持多线程Python程序,解释器定期释放并重新获取锁--默认情况下,每100个字节码指令(这可以用sys.setcheckinterval()进行更改)。锁也会被释放并重新获取,可能会阻塞I/O操作,比如读取或写入文件,以便在请求I/O的线程等待I/O操作完成时,其他线程可以运行。
我认为它很好地概括了这个问题。
发布于 2008-11-05 16:32:50
全局解释器锁是一种大型互斥锁,它可以保护参考计数器不被冲洗.如果您正在编写纯python代码,这一切都发生在幕后,但是如果将Python嵌入到C中,则可能必须显式地获取/释放锁。
此机制与编译为字节码的Python无关。Java不需要它。实际上,Jython (编译到jvm的python)甚至不需要它。
另见这个问题
https://stackoverflow.com/questions/265687
复制相似问题