python - 为什么我必须担心 CPython 中的线程安全?

标签 python multithreading thread-safety cpython gil

据我了解,全局解释器锁只允许单个线程访问解释器并执行字节码。如果是这样,那么在任何给定时间,只有一个线程会使用解释器及其内存。

因此我相信排除出现竞争情况的可能性是公平的,因为没有两个线程可以同时访问解释器的内存,但我仍然看到有关确保数据结构“线程安全”的警告。它有可能涵盖 python 解释器(如 cython)的所有实现,可以关闭 GIL 并允许真正的多线程。

我理解线程安全在没有启用 GIL 的解释器环境中的重要性。但是,对于 CPython,为什么在编写多线程 python 代码时鼓励线程安全?在 CPython 环境中会发生什么更糟糕的情况?

最佳答案

当然,竞争条件仍然会发生,因为对数据结构的访问不是原子的

假设您测试一个键是否存在于字典中,然后执行一些操作来添加该键:

if key not in dictionary:
    # calculate new value
    value = elaborate_calculation()
    dictionary[key] = value

not in 测试返回 true 后,线程可以随时切换,另一个线程 也会得出 key 不存在的结论.现在有两个线程在进行计算,你不知道哪一个会赢。

GIL 所做的只是保护 Python 的内部解释器状态。这并不意味着 Python 代码本身使用的数据结构现在已被锁定和保护。

关于python - 为什么我必须担心 CPython 中的线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39206242/

相关文章:

python - python3 : No module named release 上的 MySQLdb

c - 原子操作-C

c++ - 是否可以鼓励线程排队而不强制它?

python - wxpython中的线程安全

python - 通过代理连接到远程 jupyter 实验室实例

python - 记分牌中的 for 循环无法正常工作

Python os.rename windows错误

python - 使用 threading 和 tkinter 模块在 python 中停止线程并避免 'RuntimeError' 的最佳方法是什么?

c++ - 分离线程会导致写入撕裂吗

c++ - pthread 比没有线程慢