Python线程和GIL

2024-09-25 00:21:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我在读关于GIL的文章,它从来没有真正指明这是否包括主线程(我想是这样的)。我问这个问题是因为我有一个程序,它的线程设置可以修改字典。主线程根据玩家的输入进行添加/删除,而线程则循环数据更新和更改数据。在

但是在某些情况下,线程可能会迭代字典键,在那里可以删除它们。如果它们是顺序变化的,那为什么叫gila?如果一次只能运行一个,那么从技术上讲,这不应该发生。在

有人能解释一下这件事吗?谢谢您。在


Tags: 数据程序字典顺序文章玩家情况线程
3条回答

gil防止两个线程同时修改解释器状态。它不提供任何线程一致性约束,或者在粒度小于整个进程的情况下提供任何类型的互斥锁。如果需要在两个线程中读取和修改dict,则应该使用互斥体

GIL锁定在Python字节码级别,适用于所有线程,甚至主线程。如果有一个线程修改字典,而另一个线程迭代键,它们将相互干扰。在

“一次只运行一次”是正确的,但您必须了解粒度单位。在CPython的GIL中,粒度是字节码指令,因此可以在任何字节码的线程之间切换执行。在

它们是同时运行的,只是不同时执行。迭代可能是交错的。引用Python:

The mechanism used by the CPython interpreter to assure that only one thread executes Python bytecode at a time.

因此两个for循环可能同时运行,因此不会(例如)同时运行两个del dict[index]。在

相关问题 更多 >