2016-08-16 40 views
0

我有一个使用Python的子进程模块运行的计算密集型文件的列表。这个想法是使用Popen而不是像check_call那样更快速地浏览列表。但是,当列表大于计算机的4或5个元素时,程序会分离所有计算机资源,使其无法使用,直至完成。我的问题是:是否有一种方便的方法来限制我的程序一次打开的进程数量?限制子进程一次运行的进程数.Popen

我使用的代码很简单,但是是一个较大程序的一部分,因此粘贴运行它所需的所有代码是不可能的。

def run_fast(self): 
    ''' 
    self.cps_dct is a nested dictionary dct[index1][index2]=filename 
    CopasiSE is a program for simulating mathematical models using the terminal/cmd 

    ''' 
    for i in self.cps_dct.keys(): 
     for j in self.cps_dct[i]: 
      subprocess.Popen('CopasiSE {}'.format(self.cps_dct[i][j])) 
    return self.cps_dct 

感谢

+1

您是否在寻找'multiprocessing.Pool'? https://docs.python.org/2/library/multiprocessing.html –

回答

2

添加到什么是由克劳斯建议: 类似的东西可以工作:

from multiprocessing import Pool 
import subprocess 


class Cps: 
    def __init__(self): 
     self.cps_dct = { 
      'a': { 
       '1': 'file1', 
       '2': 'file2', 
       '3': 'file3', 
       '4': 'file4' 
      }, 
      'b': { 
       '1': 'file1', 
       '2': 'file2', 
       '3': 'file3', 
       '4': 'file4' 
      } 
     } 


def open_proc(file_name): 
    subprocess.Popen('CopasiSE {}'.format(file_name)) 

if __name__ == '__main__': 

    process_cap = 4 
    p = Pool(process_cap) 
    # Initialize the object. 
    item = Cps() 
    for i in item.cps_dct.keys(): 
     iterable = item.cps_dct[i].values() 
     p.map(open_proc, iterable) 
     p.close() 
     p.join()