我有一个大型python脚本(行数大于1500的经济模型),我想在多个cpu内核上并行执行。到目前为止,我发现的所有多处理示例都是关于简单功能的,而不是整个脚本。您能给我一个提示如何实现这一点吗? 谢谢!
说明:该模型将大量变量的数据集作为输出生成。每个结果与其他模型运行随机不同。因此,我必须经常运行模型,直到实现某种偏差测量(例如50次)。模型输入总是一样,但输出却不一样。
编辑,得到它:
import os
from multiprocessing import Pool
n_cores = 4
n_iterations = 5
def run_process(process):
os.system('python myscript.py')
if __name__ == '__main__':
p = Pool(n_cores)
p.map(run_process, range(n_iterations))
答案 0 :(得分:1)
如果您想使用一组工作人员,我通常会执行以下操作。
import multiprocessing as mp
def MyFunctionInParallel(foo, bar, queue):
res = foo + bar
queue.put({res: res})
return
if __name__ == '__main__':
data = []
info = {}
num =
ManQueue = mp.Manager().Queue()
with mp.Pool(processes=numProcs) as pool:
pool.starmap(MyFunctionInParallel, [(data[v], info, ManQueue)
for v in range(num)])
resultdict = {}
for i in range(num):
resultdict.update(ManQueue.get())
更清楚地说,您的脚本成为MyFunctionInParallel的主体。这意味着您需要稍微更改脚本,以便可以将取决于输入(即每个模型)的变量作为参数传递给MyFunctionInParallel。然后,根据您希望对每次运行获得的结果进行处理,可以使用上面概述的队列,也可以将结果写入文件中。如果使用队列,则意味着您希望能够在并行执行结束时(即在同一脚本执行中)检索数据,我建议使用字典作为将结果存储在排队,因为它们在可以包含的数据上非常灵活。另一方面,如果您希望与其他用户/应用程序共享结果,最好将结果写到文件中。您必须小心所有工作人员的并发写入,以产生有意义的输出,但是每个模型写入一个文件也是可以的。
对于代码的主要部分,num是您将要运行的模型的数量,数据和信息是每个模型特定的(或不是)某些参数,numProcs是您要启动的进程的数量。对于对starmap的调用,它将基本上将列表推导中的参数映射到MyFunctionInParallel的每次调用,从而使每个执行具有不同的输入参数。