为什么我要担心CPython中的线程安全?

据我所知,Global Interpreter Lock只允许一个线程访问解释器并执行字节码.如果是这种情况,那么在任何给定时间,只有一个线程将使用解释器及其内存.

有了这个,我相信排除有种族案例的可能性是公平的,因为没有两个线程可以同时访问解释器的内存,但我仍然看到关于确保数据结构是“线程安全”的警告.它有可能覆盖python解释器的所有实现(如cython),它可以关闭GIL并允许真正的多线程.

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

最佳答案 当然,竞争条件仍然可以发生,因为对数据结构的访问不是原子的.

假设您测试字典中存在的键,然后执行添加键的操作:

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

在not in test返回true之后,线程可以在任何时候切换,另一个线程也会得出密钥不存在的结论.现在两个线程正在进行计算,你不知道哪一个会赢.

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

点赞