将多处理函数的返回值放入矩阵
Posted
技术标签:
【中文标题】将多处理函数的返回值放入矩阵【英文标题】:Placing return values of a multiprocessing function into a matrix 【发布时间】:2021-06-05 14:11:26 【问题描述】:我的实际问题很长,我相信它可以从多处理中受益。问题的症结如下: 我有一些多处理函数,它接受两个值(x,y)输出一个数字 Q。为了说明:
def multiprocessing_func(x , y):
Q = x*y
(实际功能要复杂得多,需要对输入参数 x 和 y 进行模拟) 我有两个 x 和 y 值数组,例如:
x = np.linspace(0 , 1 , 10)
y = np.linspace(0 , 1 , 10)
我想将multiprocessing_func
中的Q值编译成矩阵Q_matrix
:
import multiprocessing
if __name__ == '__main__':
processes = []
for m in range(len(x)):
for n in range(len(y)):
p = multiprocessing.Process(target = multiprocessing_func , args=(x[m] , y[n]))
processes.append(p)
p.start()
for process in processes:
process.join()
到目前为止,我的尝试涉及在我的多处理函数中使用 return_dict
。 return_dict
只是编译列表中的所有返回值。但是,当然,这给出了错误的维度。本质上,我想知道是否有与此设置等效的多处理:
x = np.linspace(0 , 1 , 10)
y = np.linspace(0 , 1 , 10)
Q_matrix = np.zeros(shape = (len(x) , len(y)))
for m in range(len(x)):
for n in range(len(y)):
Q_matrix[m , n] = x[m]*y[n]
我确信有一个简单的解决方案,但我对多处理还是很陌生,因此非常感谢任何帮助。
【问题讨论】:
可能是多处理 Manager.array? docs.python.org/3/library/multiprocessing.html#managers @MarkSetchell 不需要使用托管阵列。 worker 函数返回一个值,主进程将其分配给适当的Q_matrix[m][n]
槽。看我的回答。
@Booboo 太好了,谢谢。
【参考方案1】:
创建子进程并将参数传递给“存在”在不同地址空间中的进程会产生开销。因此,除非您的工作函数 multiprocessing_func
的 CPU 密集程度比您目前必须使这些额外开销值得使用多处理成本的成本高得多,否则最好不要使用它。但这就是您可以使用多处理池的方式,该池的大小受您必须提交的任务数量或您拥有的 CPU 内核数量的限制。
from concurrent.futures import ProcessPoolExecutor, as_completed
import numpy as np
import os
def multiprocessing_func(x, y):
return x * y
if __name__ == '__main__':
x = np.linspace(0 , 1 , 10)
y = np.linspace(0 , 1 , 10)
Q_matrix = np.zeros(shape = (len(x) , len(y)))
pool_size = min(os.cpu_count(), len(x) * len(y))
with ProcessPoolExecutor(max_workers=pool_size) as executor:
# create mapping between the Future instance returned by submit and the original m, n indexes:
futures = executor.submit(multiprocessing_func, x[m], y[n]): (m, n) for m in range(len(x)) for n in range(len(y))
for future in as_completed(futures):
m, n = futures[future] # original indexes
result = future.result()
Q_matrix[m][n] = result
print(Q_matrix)
打印:
[[0. 0. 0. 0. 0. 0.
0. 0. 0. 0. ]
[0. 0.01234568 0.02469136 0.03703704 0.04938272 0.0617284
0.07407407 0.08641975 0.09876543 0.11111111]
[0. 0.02469136 0.04938272 0.07407407 0.09876543 0.12345679
0.14814815 0.17283951 0.19753086 0.22222222]
[0. 0.03703704 0.07407407 0.11111111 0.14814815 0.18518519
0.22222222 0.25925926 0.2962963 0.33333333]
[0. 0.04938272 0.09876543 0.14814815 0.19753086 0.24691358
0.2962963 0.34567901 0.39506173 0.44444444]
[0. 0.0617284 0.12345679 0.18518519 0.24691358 0.30864198
0.37037037 0.43209877 0.49382716 0.55555556]
[0. 0.07407407 0.14814815 0.22222222 0.2962963 0.37037037
0.44444444 0.51851852 0.59259259 0.66666667]
[0. 0.08641975 0.17283951 0.25925926 0.34567901 0.43209877
0.51851852 0.60493827 0.69135802 0.77777778]
[0. 0.09876543 0.19753086 0.2962963 0.39506173 0.49382716
0.59259259 0.69135802 0.79012346 0.88888889]
[0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
0.66666667 0.77777778 0.88888889 1. ]]
【讨论】:
以上是关于将多处理函数的返回值放入矩阵的主要内容,如果未能解决你的问题,请参考以下文章