Python线程和GIL

Cha*_*les 6 python multithreading locking gil

我正在阅读关于GIL的内容并且它从未真正指定是否包含主线程(我假设如此).我问的原因是因为我有一个带有线程设置的程序来修改字典.主线程基于播放器输入添加/删除,而线程循环数据更新和更改数据.

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

任何人都可以对这样的事情有所了解吗?谢谢.

orl*_*rlp 10

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

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

因此两个for循环可能同时运行,同时没有(例如)两个循环del dict[index].


Ned*_*der 5

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

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