首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python线程和GIL

Python线程和GIL
EN

Stack Overflow用户
提问于 2011-01-20 23:11:26
回答 4查看 3.6K关注 0票数 6

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

但是,在某些情况下,线程可能会遍历字典键,可以删除它们。如果有一个所谓的GIL,并且它们是按顺序运行的,为什么我会收到字典更改的错误?如果一次只运行一个,那么从技术上讲,这种情况不应该发生。

有没有人能解释一下这样的事情?谢谢。

EN

回答 4

Stack Overflow用户

发布于 2011-01-20 23:16:47

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

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

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

票数 10
EN

Stack Overflow用户

发布于 2011-01-20 23:15:49

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

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

票数 6
EN

Stack Overflow用户

发布于 2011-01-20 23:17:01

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

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

https://stackoverflow.com/questions/4748787

复制
相关文章

相似问题

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