为多处理绘制池图 Python

Plotting the pool map for multi processing Python

如何使用 python 中的多处理工具 运行 异步处理 运行1-3 的多个进程池。我正在尝试分别为 run1,run2,run3 传递值 (10,2,4),(55,6,8),(9,8,7)?

import multiprocessing 
def Numbers(number,number2,divider):
   value = number * number2/divider
   return value
if __name__ == "__main__":

   with multiprocessing.Pool(3) as pool:               # 3 processes
        run1, run2, run3 = pool.map(Numbers, [(10,2,4),(55,6,8),(9,8,7)]) # map input & output
然而,

Python 的多处理库确实有一个用于在父进程和子进程之间传输数据的包装器,Manager 具有共享数据实用程序,例如共享字典。关于这个话题有一个很好的stack overflow post here

使用多处理,您可以将唯一参数和共享字典传递给每个进程,并且您必须确保每个进程写入字典中的不同键。

根据您的示例使用的示例如下:

import multiprocessing


def worker(process_key, return_dict, compute_array):
    """worker function"""
    number = compute_array[0]
    number2 = compute_array[1]
    divider = compute_array[2]
    return_dict[process_key] = number * number2/divider


if __name__ == "__main__":
    manager = multiprocessing.Manager()
    return_dict = manager.dict()
    jobs = []
    compute_arrays = [[10, 2, 4], [55, 6, 8], [9, 8, 7]]
    for i in range(len(compute_arrays)):
        p = multiprocessing.Process(target=worker, args=(
            i, return_dict, compute_arrays[i]))
        jobs.append(p)
        p.start()

    for proc in jobs:
        proc.join()
    print(return_dict)

编辑:来自 Booboo 的信息更加精确,我有一个关于线程的建议,我正在删除它,因为它在 Python 中肯定不是正确的实用程序,因为 GIL。

您只需要使用方法 starmap 而不是 map,根据文档:

Like map() except that the elements of the iterable are expected to be iterables that are unpacked as arguments.

Hence an iterable of [(1,2), (3, 4)] results in [func(1,2), func(3,4)].

import multiprocessing
def Numbers(number,number2,divider):
   value = number * number2/divider
   return value
if __name__ == "__main__":

   with multiprocessing.Pool(3) as pool:               # 3 processes
        run1, run2, run3 = pool.starmap(Numbers, [(10,2,4),(55,6,8),(9,8,7)]) # map input & output
   print(run1, run2, run3)

打印:

5.0 41.25 10.285714285714286

备注

这是正确做你想做的事的方法,但你不会发现对这样一个琐碎的辅助函数使用多处理会提高性能;事实上,由于创建池以及在一个地址 space 和另一个地址之间传递参数和结果的开销,它会降低性能。