Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无管道辅助进程的最有效方法_Python_Numpy_Multiprocessing - Fatal编程技术网

Python 无管道辅助进程的最有效方法

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) 这很好,但间接成本相当大。我

在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)
这很好,但间接成本相当大。我现在使用另一种更快的方法:

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
进程,每个进程都有一个
队列。这似乎是最快的!