我正在处理一些代码,对大量问题(数万到数十万个数值积分)进行了一些相当重的数值计算。幸运的是,这些积分可以被轻松地并行处理,因此可以使用Pool.map()将工作分配给多个核心。
现在,我有一个程序,其基本工作流程如下:
自 X, param_1 和 param_2 对于池中的每个进程都是硬编码并以完全相同的方式初始化,因此这一切都可以正常工作。现在我已经让代码运行起来了,我想让文件名、param_1 和 param_2 能够在运行时由用户输入,而不是被硬编码。
应该注意的一件事是,在进行工作时,X、param_1 和 param_2 没有被修改。因为我不会修改它们,所以我可以在程序开始时像这样做:
“那样做就可以了,但由于大多数使用这个代码的用户都是在 Windows 计算机上运行代码,我不想采用命令行参数的方式。”
“我真正想要做的是像这样:”
当然,这种方法失败了,当池的map调用发生时X/param_1/param_2全部都是空的。我对多进程编程还不是很熟悉,所以我不确定为什么初始化调用会失败。有没有办法做到我想做的事情呢?或者完全换一种方式去解决这个问题?我也看过使用共享数据的方法,但根据文档的理解,那只适用于包括numpy数组在内的ctypes。非常感谢任何关于此的帮助。
现在,我有一个程序,其基本工作流程如下:
#!/usr/bin/env python
from multiprocessing import Pool
from scipy import *
from my_parser import parse_numpy_array
from my_project import heavy_computation
#X is a global multidimensional numpy array
X = parse_numpy_array("input.dat")
param_1 = 0.0168
param_2 = 1.505
def do_work(arg):
return heavy_computation(X, param_1, param_2, arg)
if __name__=='__main__':
pool = Pool()
arglist = linspace(0.0,1.0,100)
results = Pool.map(do_work,arglist)
#save results in a .npy file for analysis
save("Results", [X,results])
自 X, param_1 和 param_2 对于池中的每个进程都是硬编码并以完全相同的方式初始化,因此这一切都可以正常工作。现在我已经让代码运行起来了,我想让文件名、param_1 和 param_2 能够在运行时由用户输入,而不是被硬编码。
应该注意的一件事是,在进行工作时,X、param_1 和 param_2 没有被修改。因为我不会修改它们,所以我可以在程序开始时像这样做:
import sys
X = parse_numpy_array(sys.argv[1])
param_1 = float(sys.argv[2])
param_2 = float(sys.argv[3])
“那样做就可以了,但由于大多数使用这个代码的用户都是在 Windows 计算机上运行代码,我不想采用命令行参数的方式。”
“我真正想要做的是像这样:”
X, param_1, param_2 = None, None, None
def init(x,p1, p2)
X = x
param_1 = p1
param_2 = p2
if __name__=='__main__':
filename = raw_input("Filename> ")
param_1 = float(raw_input("Parameter 1: "))
param_2 = float(raw_input("Parameter 2: "))
X = parse_numpy_array(filename)
pool = Pool(initializer = init, initargs = (X, param_1, param_2,))
arglist = linspace(0.0,1.0,100)
results = Pool.map(do_work,arglist)
#save results in a .npy file for analysis
save("Results", [X,results])
当然,这种方法失败了,当池的map调用发生时X/param_1/param_2全部都是空的。我对多进程编程还不是很熟悉,所以我不确定为什么初始化调用会失败。有没有办法做到我想做的事情呢?或者完全换一种方式去解决这个问题?我也看过使用共享数据的方法,但根据文档的理解,那只适用于包括numpy数组在内的ctypes。非常感谢任何关于此的帮助。