Python 无管道辅助进程的最有效方法
在Python3.6(Ubuntu)中,我有32个工作进程,为了充分利用所有CPU核心,我想最好地使用它们。每个进程都应该基于一个大的numpy数组执行一个操作 我认为直接的方法是使用多处理管道:Python 无管道辅助进程的最有效方法,python,numpy,multiprocessing,Python,Numpy,Multiprocessing,在Python3.6(Ubuntu)中,我有32个工作进程,为了充分利用所有CPU核心,我想最好地使用它们。每个进程都应该基于一个大的numpy数组执行一个操作 我认为直接的方法是使用多处理管道: # Using a classic multi processing pool structure: for c in range(cycles): for pipe in process_pipes: pipe[0].send(numpy_data) 这很好,但间接成本相当大。我
# Using a classic multi processing pool structure:
for c in range(cycles):
for pipe in process_pipes:
pipe[0].send(numpy_data)
这很好,但间接成本相当大。我现在使用另一种更快的方法:
def pool_init(ab):
global buffer_shared
buffer_shared = ab
buffer_shared_base = mp.Array(ctypes.c_float, BUFFER_SHARED_SIZE)
buffer_shared = np.ctypeslib.as_array(buffer_shared_base.get_obj())
buffer_shared = buffer_shared.reshape(num_processes, BUFFER_SHARED_SIZE)
pool = mp.Pool(initializer=pool_init, initargs=(buffer_shared, ), processes=num_processes)
for c in range(cycles):
# chunk_size is the numpy data size for each process
buffer_shared[:, 0:chunk_size] = NEW_DATA
for pipe in pipes:
pipe[0].send(True)
其主要思想是使用共享内存来传输数据,而只使用管道来传输启动信号。这要快得多,可能是因为numpy数组不必进行酸洗
由于此解决方案对我来说仍然很麻烦,您能告诉我您认为这种设置的最佳(=最低开销)方式是什么吗?为什么不使用多进程队列?我需要确保第n个submit到达第n个进程,因为这些进程包含state。因此,我需要一个提交队列,每个进程的速度都会变慢。您使用
池来做什么?其中定义了管道。此示例不可运行,因此很难提供帮助。该池用于生成进程。现在,我没有使用池,只使用了多个持久化的mp.Process
进程,每个进程都有一个队列。这似乎是最快的!