为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要使用全局翻译锁?

为什么要使用全局翻译锁?

胡子哥哥 2019-11-11 10:30:15
Python的Global Interpreter Lock的确切功能是什么?其他编译为字节码的语言是否采用类似的机制?
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

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


您可以使用细粒度的锁定,其中每个单独的结构都有其自己的锁定。


您可以使用粗粒度锁定,其中一种锁定可以保护所有内容(GIL方法)。


每种方法各有利弊。细粒度的锁定允许更大的并行度-两个线程不共享任何资源时可以并行执行。但是,这需要更大的管理开销。对于每一行代码,您可能需要获取并释放几个锁。


相反,粗粒度方法则相反。两个线程不能同时运行,但是单个线程将运行得更快,因为它并没有做太多记账工作。最终,它归结为单线程速度和并行性之间的折衷。


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


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


它是多种多样的,可能不应该将它视为语言属性,而应该将其视为实现属性。例如,有些Python实现(例如Jython和IronPython)使用其底层VM的线程方法,而不是GIL方法。此外,Ruby的下一个版本似乎正朝着引入GIL 迈进。


查看完整回答
反对 回复 2019-11-11
?
HUH函数

TA贡献1836条经验 获得超4个赞

以下来自官方的Python / C API参考手册:


Python解释器不是完全线程安全的。为了支持多线程Python程序,当前线程必须拥有一个全局锁,才能安全地访问Python对象。如果没有锁,即使是最简单的操作也可能在多线程程序中引起问题:例如,当两个线程同时增加同一对象的引用计数时,引用计数最终只能增加一次而不是两次。


因此,存在这样的规则,即只有已获得全局解释器锁的线程才可以在Python对象上操作或调用Python / C API函数。为了支持多线程Python程序,解释器会定期释放并重新获取锁-默认情况下,每100个字节码指令(可以通过sys.setcheckinterval()进行更改)。锁定也被释放并重新获得,这可能会阻止潜在的阻塞I / O操作(如读取或写入文件),以便在请求I / O的线程正在等待I / O操作完成的同时运行其他线程。


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


查看完整回答
反对 回复 2019-11-11
  • 3 回答
  • 0 关注
  • 323 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信