2013-08-29 48 views
1

我想同时运行多次Python模拟,但在每次运行时参数略有不同。我正在尝试使用multiprocessing模块来执行此操作。我开始这样的代码,在那里我有定义为函数的基本模拟,与参数参数:多处理同时运行的Python脚本

import multiprocessing 
from math import * 

def sim_seq(output_name,input_name,s_val...#more arguments): 
    #do work here 
    output.write(#data) 
    output.close() 
    return 

我也创建与参数的文本文件用于模拟的每次运行,这是我读和参数下面的循环中,在那里我试图用多用:

input_batch=('batch_file.txt') 
if __name__ == '__main__': 
    jobs=[] 
    with open(input_batch) as f: 
     for line in f: 
      line=line.split(' ') 
      for i in line: 
       if i[0]=='o': 
       output_name=str(i[2:]) 
       #read in more parameters from batch_file.txt 
     p = multiprocessing.Process(
      target=sim_seq, 
      args=(output_name,input_name,s_val...#more arguments)) 
     jobs.append(p) 
    for i in jobs: 
     i.start() 

这基本上完成了我想要它做的,它在一次运行三种模拟,各有不同参数。但是,我正在使用的计算机有16个计算节点,每个节点有32个处理器。我想知道如何控制每个模拟运行的位置。例如,我可以告诉每个处理器运行单独的模拟吗?我是使用多处理器的新手,我想知道我该如何告诉处理器或哪个节点要做什么。我可以拥有32个单独的参数设置,并且可以在自己的处理器上运行每个32个仿真实例,但它们都在同一时间运行吗?使用多处理,多次同时运行同一个python函数的计算方法最快,但每次运行的参数不同?预先感谢任何意见和建议。

回答

1

(我假设每个计算节点都是一个单独的机器,有自己的一套核心的。如果你的计算机集群有某种操作系统,因此他们似乎都认为本地虚拟化的核心,那么你可以忽略“多个节点”下方位。)

在一个节点上

multiprocessing模块本身处理的操作系统的单个实例内的多个进程。如果在一个节点上启动了top或类似的进程列表,并且它显示了N个内核,那么这就是Python模拟可用的内核数量。

在这一约束,但是,您可以生成并根据需要管理尽可能多的进程,并且操作系统将安排他们在使用其正常的进程调度程序可用的核心。所以,在你的情况下,我听起来应该能够在单个节点上并行运行32个单独的模拟。你所需要做的就是设置你的循环来创建32个进程,给它们参数运行,并等到它们全部完成。

如果您有32个以上的模拟运行,您可以设置一个包含32个工人的multiprocessing.Pool,然后在模拟参数列表上使用pool.map将工作分配给每个核心。

多个节点

如果你有超过32个模拟,并且要开始采取在单独的节点核心(您可能需要登录到使用ssh或类似的独立节点)的优势,那么理论上你可以使用多处理模块中的“远程管理器”来处理这个问题。但是,我建议看看IPython.parallel的强大功能 - 它允许您在多个节点上启动“处理引擎”,然后使用IPython shell将工作分配给节点。这最终会与上述进程池非常相似,只会利用群集中所有计算节点上的所有内核。

或者,您可以设置或利用大量现有集群调度程序(Condor,Sun GridEngine等)中的任何一个在每个处理节点上启动一次(甚至是32次)模拟。

相关问题