Python 线程与全局解释器锁

6 投票
4 回答
4943 浏览
提问于 2025-04-16 10:19

我在阅读关于GIL(全局解释器锁)的内容时,发现并没有明确说明这是否包括主线程(我猜是包括的)。我之所以问这个,是因为我有一个程序,里面有线程在修改一个字典。主线程根据玩家的输入来添加或删除字典里的内容,而另一个线程则在循环更新和改变这些数据。

不过在某些情况下,一个线程可能会遍历字典的键,而这个时候可能会有人删除这些键。如果有所谓的GIL,并且它们是顺序运行的,为什么我会遇到字典改变的错误呢?如果理论上只应该有一个线程在运行,那这种情况不应该发生啊。

有没有人能帮我解释一下这个问题?谢谢。

4 个回答

3

全局解释锁(gil)会阻止两个线程同时修改解释器的状态。它并没有提供任何线程一致性的限制,也没有在小于整个进程的范围内提供任何类型的互斥锁。如果你需要在两个线程中读取和修改一个字典,你应该使用互斥锁。

6

GIL是Python中的一个锁,它在字节码级别上工作,适用于所有线程,包括主线程。如果有一个线程在修改字典,而另一个线程在遍历字典的键,它们会互相干扰。

“一次只能有一个线程在运行”这句话是对的,但你需要理解这个“一个”的具体意思。在CPython的GIL中,这个“一个”的单位是字节码指令,所以在任何字节码指令处,执行都可以在不同的线程之间切换。

11

它们是同时运行的,只是执行的时机不同。它们的运行可能会交错进行。引用一下Python的说法:

CPython解释器使用的机制确保一次只有一个线程执行Python的字节码

所以,两个for循环可能会同时运行,但比如说,不会有两个del dict[index]同时执行。

撰写回答