我的理解是,由于 cPython 中的全局解释器锁,任何时候都只能执行一个线程。这是否不会自动保护免受竞争条件的影响,例如丢失更新问题?
为了清楚起见,我是从理论的角度问的。如果没有同步,我永远不会编写线程代码。
我的理解是,由于 cPython 中的全局解释器锁,任何时候都只能执行一个线程。这是否不会自动保护免受竞争条件的影响,例如丢失更新问题?
为了清楚起见,我是从理论的角度问的。如果没有同步,我永远不会编写线程代码。
由于 GIL,每个进程只有一个线程来执行 Python 字节码;字节码评估循环受它保护。
锁每秒钟释放一次sys.getswitchinterval()
,此时可以进行线程切换。这意味着对于Python代码,线程切换仍然可以发生,但只能在字节码指令之间进行。任何依赖线程安全的代码都需要考虑到这一点。可以在一个字节码中完成的操作可以是线程安全的,其他一切都不是。
即使是单字节码指令也可以触发其他 Python 代码;例如,该行object[index]
可以触发__getitem__
对自定义类的调用,该类在 Python 中实现。因此,单个BINARY_SUBSCR
操作码不一定是线程安全的,具体取决于对象类型。