python - 在有 GIL 的情况下,您可以在 Python 中竞争条件吗?

标签 python race-condition gil

我的理解是,由于 cPython 中的全局解释器锁 (GIL),任何时候只能执行一个线程。这是否会自动防止竞争条件,例如丢失更新问题?

最佳答案

由于 GIL,每个进程只有一个线程处于事件状态以执行 Python 字节码;字节码评估循环受其保护。

锁每隔sys.getswitchinterval()释放一次秒,此时可以进行线程切换。这意味着对于 Python 代码,线程切换仍然可以发生,但只能在字节代码指令之间进行。任何依赖线程安全的代码都需要考虑到这一点。可以在一个字节码中完成的操作可以是线程安全的,其他一切都不是。

即使是单字节代码指令也可以触发其他Python代码;例如,行 object[index] 可以触发对自定义类的 __getitem__ 调用,该自定义类是用 Python 实现的。因此,单个 BINARY_SUBSCR 操作码不一定是线程安全的,具体取决于对象类型。

关于python - 在有 GIL 的情况下,您可以在 Python 中竞争条件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23855138/

相关文章:

python - 在字典中使用字符串作为键总是更快吗?

python - 如何从 Zillow 链接中提取估计的房屋值(value)?

python - 在 Python 中断言文件权限时避免竞争条件

Python GIL 和多线程

python - 是否有用于无序集合的 Python 数据类型?

python - 使用 Pandas DataFrame 将值放在组下方意味着

javascript - 使用 FB.logout 避免 Facebook JavaScript API 中的竞争条件

c - 尽管 atomicAdd 函数 (CUDA) 存在竞争条件?

python - Pypy 的无堆栈线程选项支持并行执行吗?

python - 在多处理中,每个进程在 CPython 中都有自己的 GIL,这是真的吗?这与创建新的运行时有什么不同?