Python多处理和共享numpy数组

时间:2016-03-08 12:39:31

标签: python multiprocessing

我有一个问题,与此类似:

AAA

因此,显然不需要将其作为连续计算运行,因为每个子矩阵都可以独立计算。 我想使用多处理模块并为for循环创建最多4个进程。 我阅读了一些关于多处理的教程,但是无法弄清楚如何使用它来解决我的问题。

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

并行化该代码的一种简单方法是使用Pool进程:

pool = multiprocessing.Pool()
results = pool.starmap(get_sub_matrix_C, ((i, other_args) for i in range(10)))

for i, res in enumerate(results):
    C[i*10:(i+1)*10,:10] = res

我使用starmap,因为get_sub_matrix_C函数有多个参数(starmap(f, [(x1, ..., xN)])调用f(x1, ..., xN))。

但请注意,序列化/反序列化可能需要很长时间和空间,因此您可能必须使用更低级别的解决方案来避免此开销。

看起来你正在运行一个过时的python版本。您可以使用普通starmap替换map,但是您必须提供一个带有单个参数的函数:

def f(args):
    return get_sub_matrix_C(*args)

pool = multiprocessing.Pool()
results = pool.map(f, ((i, other_args) for i in range(10)))

for i, res in enumerate(results):
    C[i*10:(i+1)*10,:10] = res

答案 1 :(得分:0)

以下配方也许可以完成这项工作。随意问。

import numpy as np
import multiprocessing

def processParallel():

    def own_process(i, other_args, out_queue):
        C_sub = get_sub_matrix_C(i, other_args)
        out_queue.put(C_sub)            

    sub_matrices_list = []
    out_queue = multiprocessing.Queue()
    other_args = 0
    for i in range(10):
        p = multiprocessing.Process(
                            target=own_process,
                            args=(i, other_args, out_queue))
        procs.append(p)
        p.start()

    for i in range(10):
        sub_matrices_list.extend(out_queue.get())

    for p in procs:
        p.join()

    return sub_matrices_list    

C = np.zeros((100,10))

result = processParallel()

for i in range(10):
    C[i*10:(i+1)*10,:10] = result[i]