【问题标题】:multiprocessing simultaneous python scripts efficiently高效地多处理同时 python 脚本
【发布时间】:2013-09-02 02:10:02
【问题描述】:

我正在尝试同时运行 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 函数但每次运行使用不同参数的最快计算方法是什么?提前感谢您的任何意见/建议。

【问题讨论】:

    标签: python performance multiprocessing simultaneous


    【解决方案1】:

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

    在一个节点上

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

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

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

    多个节点

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多