在并行/多处理中运行大型python脚本

时间:2019-05-02 06:49:20

标签: python multiprocessing

我有一个大型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))

1 个答案:

答案 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的每次调用,从而使每个执行具有不同的输入参数。