首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么是环球翻译锁?

为什么是环球翻译锁?
EN

Stack Overflow用户
提问于 2008-11-05 16:23:48
回答 6查看 17.9K关注 0票数 91

Python的全局解释器锁的功能到底是什么?其他被编译成字节码的语言是否采用了类似的机制?

EN

回答 6

Stack Overflow用户

发布于 2008-11-05 16:44:11

通常,对于任何线程安全问题,您都需要使用锁来保护内部数据结构。这可以通过不同级别的粒度来完成。

  • 您可以使用细粒度锁定,其中每个单独的结构都有自己的锁。
  • 您可以使用粗粒度锁定,其中一个锁保护一切( GIL方法)。

每种方法都有不同的优缺点。细粒度锁定允许更大的并行性--两个线程在不共享任何资源时可以并行执行。然而,行政管理费用要大得多。对于每一行代码,您可能需要获取和释放几个锁。

粗粒度方法正好相反。两个线程不能同时运行,但是单个线程会运行得更快,因为它没有做那么多的簿记工作。最终,它归结为在单线程速度和并行性之间的权衡。

有几次尝试删除python中的GIL,但是单线程计算机的额外开销通常太大。由于锁争用,有些情况下即使在多处理器机器上也可能会慢一些。

其他被编译成字节码的语言是否采用了类似的机制?

它是不同的,它可能不应该被视为语言属性,而应该被视为实现属性。例如,有一些Python实现,比如Jython和IronPython,它们使用底层VM的线程方法,而不是GIL方法。此外,下一个版本的Ruby看起来正在移动奔向引入一个GIL。

票数 72
EN

Stack Overflow用户

发布于 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操作完成时,其他线程可以运行。

我认为它很好地概括了这个问题。

票数 34
EN

Stack Overflow用户

发布于 2008-11-05 16:32:50

全局解释器锁是一种大型互斥锁,它可以保护参考计数器不被冲洗.如果您正在编写纯python代码,这一切都发生在幕后,但是如果将Python嵌入到C中,则可能必须显式地获取/释放锁。

此机制与编译为字节码的Python无关。Java不需要它。实际上,Jython (编译到jvm的python)甚至不需要它。

另见这个问题

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/265687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档