如何在 Python 线程中不锁定地读取变量?

How to read a variable without lock in Python threads?

我正在使用 Python 线程同时做一些工作。我让主线程执行task_A,同时创建一个线程执行task_B。以下是我正在处理的代码的简化版本:

import threading
import numpy as np

def task_B(inc):
    for elem in array:
        value = elem + inc

if __name__ == '__main__':

    array = np.random.rand(10)

    t1 = threading.Thread(target=task_B, args=(1))
    t1.start()

    # task_A
    array_copy = list()
    for elem in array:
        array_copy.append(elem)

    t1.join()

我知道上面的代码没有做任何有意义的事情。请将其视为一个简化的示例。可以看到,变量array在主线程和新创建的线程t1中都是只读的。因此,不需要在主线程和 t1 线程中都锁定 array,因为其中 none 修改(或写入)变量。但是,当我对代码计时时,似乎 Python 线程自动锁定线程之间共享的变量,即使它们是只读的。有没有办法在不锁定只读变量的情况下使每个线程同时 运行 ?我找到了 this code,但不知道如何将它应用到我的情况。

你说的对,在这种情况下“不需要锁”,但是 CPython 解释器(我猜你使用 运行 你的 Python代码)不是那么聪明。
Python 代码始终在持有 GIL 的同时执行,因此两个线程相互排他地执行(而不是同时执行),尽管是以交错的方式(如果没有线程就不会是这种情况,执行将是纯顺序的) .
这就是为什么性能关键代码经常被卸载到其他 * 进程 的原因(使用 multiprocessing library) or written in Cython (here an example 解决与您类似的问题)。
有关 GIL 为何存在的更多详细信息,请参阅该问题:.

希望在未来 (2022+) Gil 可能会放松,但现在你被困住了,所以要解决它。