我读过关于GIL的文章,但它从来没有明确说明这是否包括主线程(我假设是这样)。我这样问的原因是因为我有一个带有线程设置的程序,可以修改字典。主线程根据玩家输入进行添加/删除,而线程循环数据更新和更改数据。
但是,在某些情况下,线程可能会遍历字典键,可以删除它们。如果有一个所谓的GIL,并且它们是按顺序运行的,为什么我会收到字典更改的错误?如果一次只运行一个,那么从技术上讲,这种情况不应该发生。
有没有人能解释一下这样的事情?谢谢。
发布于 2011-01-20 23:16:47
它们是同时运行的,只是它们不会同时执行。迭代可能是交错的。引用Python:
由CPython解释器用来确保一次只有一个线程执行 Python 字节码的机制。
因此,可能会同时运行两个for循环,但不会(例如)同时运行两个del dict[index]。
发布于 2011-01-20 23:15:49
GIL锁定在Python字节码级别,并应用于所有线程,甚至主线程。如果你有一个线程在修改字典,另一个线程在迭代关键字,它们会相互干扰。
“一次只能运行一个”是正确的,但您必须了解粒度的单位。在CPython的GIL中,粒度是字节码指令,所以执行可以在任何字节码的线程之间切换。
发布于 2011-01-20 23:17:01
gil防止两个线程同时修改解释器状态。它没有提供任何线程一致性约束,或者在比整个进程更小的粒度上提供任何类型的互斥。如果需要在两个线程中读取和修改dict,则应使用互斥锁
https://stackoverflow.com/questions/4748787
复制相似问题