我的理解是,由于 cPython 中的全局解释器锁 (GIL),任何时候只能执行一个线程。这是否会自动防止竞争条件,例如丢失更新问题?
最佳答案
由于 GIL,每个进程只有一个线程处于事件状态以执行 Python 字节码;字节码评估循环受其保护。
锁每隔sys.getswitchinterval()
释放一次秒,此时可以进行线程切换。这意味着对于 Python 代码,线程切换仍然可以发生,但只能在字节代码指令之间进行。任何依赖线程安全的代码都需要考虑到这一点。可以在一个字节码中完成的操作可以是线程安全的,其他一切都不是。
即使是单字节代码指令也可以触发其他Python代码;例如,行 object[index]
可以触发对自定义类的 __getitem__
调用,该自定义类是用 Python 实现的。因此,单个 BINARY_SUBSCR
操作码不一定是线程安全的,具体取决于对象类型。
关于python - 在有 GIL 的情况下,您可以在 Python 中竞争条件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23855138/