0

我正在使用 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。因此,不需要锁定array主线程和t1线程,因为它们都不会修改(或写入)变量。但是,当我对代码进行计时时,Python 线程似乎会自动锁定线程之间共享的变量,即使它们是只读的。有没有办法让每个线程同时运行而不锁定只读变量?我找到了这段代码,但无法弄清楚如何将其应用于我的情况。

4

1 回答 1

0

你说得对,在这种情况下“不需要锁”,但是 CPython 解释器(我猜你用它来运行你的 Python 代码)并不那么聪明。
Python 代码总是在持有 GIL 的情况下执行,因此两个线程彼此排他地执行(而不是同时执行),尽管是以交错的方式(如果没有线程则不会出现这种情况,执行将是纯顺序的)。
这就是为什么性能关键代码经常被卸载到其他 *进程(使用multiprocessing)或用Cython编写的原因(这里是一个解决与您类似的问题的示例)。
有关 GIL 为何存在的更多详细信息,请参阅该问题:有没有办法使用纯 python 为纯函数释放 GIL?.

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

于 2022-01-10T09:15:44.317 回答