将多处理函数的返回值放入矩阵中

问题描述 投票:0回答:2

我的实际问题相当长,我相信它可以从多重处理中受益。问题的症结如下: 我有一些多处理函数,它接受两个值(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]

我确信有一个简单的解决方案,但我对多重处理还很陌生,因此非常感谢任何帮助。

python multithreading numpy multiprocessing
2个回答
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.        ]]

0
投票

嗯,你是否尝试过将其关闭并再次打开,伙计?

© www.soinside.com 2019 - 2024. All rights reserved.