我正在尝试在一个简单的for
循环中修改一个简单的数组。因为对于使用单个线程的应用程序来说似乎是一个瓶颈,所以我决定看看python的多处理API。但是,我似乎无法同时修改 numpy 数组,即使我只修改每个元素一次。看看这个示例代码:
将 numpy 导入为 NP 导入多处理
arrlen = 3
arr = np.zeros(arrlen)
def func(x):
arr[x] = 1
for i in range(arrlen):
func(i)
print(arr)
这一切都很好,花花公子,结果我得到了[1.0, 1.0, 1.0]
,正如预期的那样。但是一旦我用pool.map
替换 for 循环,它就不起作用。
pool = multiprocessing.Pool()
pool.map(func, range(arrlen))
我检查了 PyCharm 调试器,func 实际上使用正确的参数被调用,但第二个示例打印[0.0, 0.0, 0.0]
.知道为什么吗?任何想法如何解决这个问题?
使用多处理时,您生成的每个线程都会在其自己的范围内接收进程对象。
您的函数需要返回一个值,然后您需要将这些值聚合到全局数组中。
生成的线程无法访问全局数组。 所以
def func(x):
return = 1
然后
arr = np.array(pool.map(func, range(arrlen)))
会做你想做的事。