运行多个外部程序

Gio*_*aia 5 python subprocess external-process

因此,我设置了一个执行外部程序(用 Fortran 77 编写)的简短脚本。我想运行该程序的多个实例,由于我的计算机上有 8 个内核,我发现的最简单的解决方案是:

import subprocess


import os


i = n

while(i<n):
  dire = "dir/Run"+str(i)+"/"
  os.chdir(dire)
  p1 = subprocess.Popen(['./mej'])
  dire = "dir/Run"+str(i+1)+"/"
  os.chdir(dire)
  p2 = subprocess.Popen(['./mej'])
  dire = "dir/Run"+str(i+2)+"/"
  os.chdir(dire)
  p3 = subprocess.Popen(['./mej'])
  dire = "dir/Run"+str(i+3)+"/"
  os.chdir(dire)
  p4 = subprocess.Popen(['./mej'])  
  dire = "dir/Run"+str(i+4)+"/"
  os.chdir(dire)
  p5 = subprocess.Popen(['./mej'])
  dire = "dir/Run"+str(i+5)+"/"
  os.chdir(dire)
  p6 = subprocess.Popen(['./mej'])
  dire = "dir/Run"+str(i+6)+"/"
  os.chdir(dire)
  p7 = subprocess.Popen(['./mej'])
  dire = "dir/Run"+str(i+7)+"/"
  os.chdir(dire)
  p8 = subprocess.Popen(['./mej'])
  dire = "/Run"+str(i+8)+"/"
  os.chdir(dire)
  p3 = subprocess.Popen(['./mej'])
  exit_codes = [p.wait() for p in p1, p2, p3, p4, p5, p6, p7, p8]
  i = i + 8



print "Job's done!"
Run Code Online (Sandbox Code Playgroud)

现在,一开始效果很好,但是我只是更改为可变时间步长,这样做每个集成运行的时间差异很大。现在的问题是,脚本将等待最慢的一个完成,然后再启动一组新的集成。我该如何编写才能让 8 个实例始终运行?

jfs*_*jfs 4

您可以使用线程池来保持所有 CPU 忙碌:

#!/usr/bin/env python
import os
import subprocess
from multiprocessing.pool import ThreadPool

def run(i):
    working_dir = "dir/Run/" + str(i + 1)
    return i, subprocess.call(os.path.join(working_dir, 'mej'), cwd=working_dir)

results = ThreadPool().map(run, range(n))
Run Code Online (Sandbox Code Playgroud)

一旦一个mej进程完成,下一个进程就会开始。os.cpu_count()一次运行的并发工作进程数不多。