如何确保此代码是线程安全的?
import numpy as np
from threading import Thread
n_threads = 5
ones = np.ones((5, 5))
A = np.ones((5, 5))
def my_function():
global A
for i in range(250):
A += ones # is += thread safe ?
threads = [Thread(target=my_function) for i in range(n_threads)]
for t in threads:
t.start()
for t in threads:
t.join()
print(A)
A应该是一个关键的共享内存吗?令人惊讶的是,我总是得到相同的结果,并且数组的所有条目都具有相同的值.我希望线程能够更新矩阵的值,并且有些东西会丢失……
谢谢.
最佳答案 你的代码不安全.一些NumPy ufunc(如你隐式使用的add())可以释放GIL.您玩具示例中从未发现任何问题的原因可能是它运行的时间很短,数据量非常小.您也可以通过计算的简单性来避免问题,但我认为您的实际代码更复杂.
简而言之,在没有锁定的情况下,您无法在多个线程中执行您正在执行的操作.锁定可能会破坏这样的代码的多线程的目的.