如何在 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 可能会放松,但现在你被困住了,所以要解决它。
我正在使用 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 可能会放松,但现在你被困住了,所以要解决它。