多处理同步python脚本有效

时间:2013-08-29 14:57:21

标签: python performance multiprocessing simultaneous

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

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 个答案:

答案 0 :(得分:1)

(我假设您的每个计算节点都是一台独立的计算机,具有自己的一组核心。如果您的计算群集具有某种虚拟化核心的操作系统,因此它们看起来都是本地的,那么您可以忽略下面的“多个节点”位。)

在一个节点上

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

但是,在该约束中,您可以根据需要生成和管理任意数量的进程,操作系统将使用其正常的进程调度程序将它们排列在可用的核心上。因此,在您的情况下,我觉得您应该能够在单个节点上并行运行32个单独的模拟。您需要做的就是设置循环以创建32个进程,为它们提供要运行的参数,并等待它们全部完成。

如果您要运行超过32个模拟,则可以设置包含32个工作线程的multiprocessing.Pool,然后在模拟参数列表上使用pool.map将工作分配到每个核心

多个节点

如果你有超过32个模拟,并且你想开始利用单独节点上的核心(你可能需要使用ssh等登录到单独的节点),那么理论上你可以使用来自多处理模块的“远程管理器”来处理这个问题。

但是,我建议看一下IPython.parallel的强大功能 - 它允许你在多个节点上启动“处理引擎”,然后你可以使用IPython shell将工作分配给节点。这最终将与上述流程池非常相似,只会利用群集中所有计算节点上的所有核心。

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