尝试使用此处的代码https://stackoverflow.com/a/15390953/378594将numpy数组转换为共享内存数组并返回。运行以下代码:
shared_array = shmarray.ndarray_to_shm(my_numpy_array)
然后将shared_array作为参数传递给多处理池的参数列表:
pool.map(my_function, list_of_args_arrays)
list_of_args_arrays
包含我的共享数组和其他参数。
导致以下错误
PicklingError: Can't pickle <class 'multiprocessing.sharedctypes.c_double_Array_<array size>'>: attribute lookup multiprocessing.sharedctypes.c_double_Array_<array size> failed
<array_size>
是我的numpy数组的线性大小。
我觉得numpy ctypes或类似的东西发生了什么变化?
我只需要访问共享信息。这些流程不会进行任何编辑。
调用池的函数位于类中。启动该类,并由main.py文件调用该函数。
答案 0 :(得分:1)
显然,当使用multiprocessing.Pool
时,所有参数都被腌制,因此使用multiprocessing.Array
没有用处。更改代码以便它使用一系列进程就可以了。但
答案 1 :(得分:0)
我认为你过于复杂化了: 不需要pickle数组(特别是如果它们是只读的):
你只需要通过一些全局变量来保持它们的可访问性:
(已知在linux下工作,但可能无法在Windows中运行,不知道)
import numpy as np,multiprocessing as mp
class si:
arrs=None
def summer(i):
return si.arrs[i].sum()
def main():
si.arrs=[np.zeros(100) for _ in range(1000)]
pool = mp.Pool(16)
res=pool.map(summer,range(1000))
print res
if __name__ == '__main__':
main()
如果需要读取和写入数组,则需要使用: Is shared readonly data copied to different processes for Python multiprocessing?