我的实际问题相当长,我相信它可以从多重处理中受益。问题的症结如下: 我有一些多处理函数,它接受两个值(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)
我想将 Q 的值从
multiprocessing_func
编译成矩阵 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]
我确信有一个简单的解决方案,但我对多重处理还很陌生,因此非常感谢任何帮助。
创建子进程并将参数传递给“生活”在不同地址空间的进程会产生开销。因此,除非您的工作函数
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. ]]
嗯,你是否尝试过将其关闭并再次打开,伙计?