为多处理绘制池图 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 和另一个地址之间传递参数和结果的开销,它会降低性能。
如何使用 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 和另一个地址之间传递参数和结果的开销,它会降低性能。