在共享内存中使用 NumPy 数组进行多处理
在 Python 中使用多处理时,在进程之间共享数组可能具有挑战性。如果您要求 NumPy 数组表现得像 NumPy 数组而不是简单的 ctypes 数组,那么在多处理中使用 NumPy 数组可能会遇到困难。
问题陈述
在提供的示例中,NumPy 数组包装在 ctypes Array() 对象中。虽然这允许以 ctypes 方式访问数组,但它失去了 NumPy 数组的功能。无法执行 -1*arr 或 arr.sum() 等操作,将其转换回 NumPy 数组会破坏共享内存。
使用shared_arr.get_lock()的解决方案
要在使用共享内存数组时保留 NumPy 数组功能,您可以使用共享内存数组中提供的 get_lock() 方法array:
shared_arr = mp.Array(ctypes.c_double, N) def f(i): with shared_arr.get_lock(): arr = np.frombuffer(shared_arr.get_obj()) arr[i] = -arr[i]
通过使用 get_lock() 方法,可以同步对共享数组的访问,并确保在进程内像 NumPy 数组一样访问它。
示例
以下代码提供了一个改进的示例,它在利用共享的同时保留了 NumPy 数组功能内存:
import multiprocessing as mp import numpy as np N = 100 shared_arr = mp.Array(ctypes.c_double, N) arr = np.frombuffer(shared_arr.get_obj()) # Fill the shared array with random values arr[:] = np.random.uniform(size=N) # Create a pool of processes with mp.Pool(initializer=init, initargs=(shared_arr,)) as pool: # Define functions that modify the shared array def f(i): with shared_arr.get_lock(): arr -= 1 # Subtract 1 from each array element within the process pool.map(f, range(N)) # Check the modified shared array assert np.allclose(arr, -1)
在这个例子中,init()函数为每个进程设置shared_arr,f()函数对锁内的共享数组进行操作。加入池后,主进程就可以访问修改后的共享数组。此方法提供了一种同步且与 NumPy 兼容的方式来在多处理中使用共享数组。
以上是如何在 Python 中使用共享内存中的 NumPy 数组进行多重处理?的详细内容。更多信息请关注PHP中文网其他相关文章!