我想通过在python脚本中调用它来运行一个用c语言编写的模型。在多次执行期间,我想使用多个内核,因此尽可能减少执行时间。
到目前为止,我发现了子进程和多进程库来帮助解决我的问题。但是,该模型使用相同的输入文件夹来获取输入文件,但在不同的文件夹中生成输出文件。所有这些路径都在方案文件中指定,该方案文件在模型的执行中被指定为参数。我稍后会收集输出,因此将它们放在单独的输出文件夹中对我来说是优选的。但是,我想知道是否可以在不干扰c代码的情况下在python中管理这种共享输入情况。
import multiprocessing
import subprocess
from subprocess import call
from time import strftime, localtime
def run_model(num,par_arr,scenarioPath):
cmd =["./model","model_model",str(scenarioPath),str(par_arr[0]), str(par_arr[1]),str(par_arr[2]), str(par_arr[3]),str(par_arr[4]),str(par_arr[5])]
subprocess.Popen(cmd)
return
if __name__ == '__main__' :
jobs =[]
start = time.time()
print strftime("%a, %d %b %Y %H:%M:%S \n", localtime())
path = os.getcwd()
scenarioPath = str(path)
#just to demonstrate two sets of run
parameterArray = [[20, 100 ,0.13,100,55,55],[30, 100 ,0.13,100,55,55]]
for i in range(0,len(parameterArray)):
p = multiprocessing.Process(target = run_model,args=((i+1),parameterArray[i],scenarioPath))
jobs.append(p)
p.start()
end = time.time()
print strftime("%a, %d %b %Y %H:%M:%S \n", localtime())
print("Elapsed time in seconds: " +str(end-start))
最后,在模型执行完成之前写入经过的时间。因此,我无法用这种结构测量经过的时间。
提前感谢您的时间和精力。
编辑:要回答下面的评论之一,我再次重新提出问题。 我的第一个问题是,是否可以管理相同的输入读数 python中的子进程模型。虽然有一组参数 在python脚本(parameterArray)中作为输入参数给出,有一组其他输入,如栅格文件,在执行期间进行模型读取。当我尝试在python中并行调用模型时,所有调用都希望同时读取相同的光栅文件。 即,模型从文件夹中读取输入栅格,并且此步骤对于每次运行都是相同的。
我的第二个问题是我无法通过上面的脚本获得正确的经过时间。该脚本按预期并行运行模型两次,但它打印“以秒为单位的经过时间:”print语句在模型执行完成之前写入。