我正在使用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
,因为它们都不修改(或写入(变量。然而,当我计时代码时,Python线程似乎会自动锁定线程之间共享的变量,即使它们是只读的。有没有一种方法可以让每个线程同时运行而不锁定只读变量?我找到了这个代码,但不知道如何将其应用于我的情况。
你说在这种情况下"不需要锁";,但是CPython解释器(我猜你用来运行Python代码(并没有那么聪明
Python代码总是在保持GIL的同时执行,这样两个线程就只能从另一个线程执行(而不是并发执行(,尽管是以交错的方式执行(如果没有线程,执行将完全是顺序的(
这就是为什么性能关键代码经常被卸载到其他*进程(使用multiprocessing
库(或用Cython编写(这里是解决类似问题的示例(的原因
关于GIL为什么存在的更多细节,请参阅该问题:有没有一种方法可以使用纯python为纯函数发布GIL?。
有希望在未来(2022+(,吉尔可能会放松,但现在你已经被它卡住了,所以要围绕它努力。