2016-08-16 4 views
0

У меня есть список файлов с интенсивным вычислением, которые я запускаю с использованием модуля подпроцесса Python. Идея состоит в том, чтобы использовать Popen, а не что-то вроде check_call, чтобы быстрее просмотреть список. Однако, когда список больше, чем, скажем, 4 или 5 элементов на компьютерах, программа уничтожает все ресурсы компьютеров, что делает его непригодным для использования до его завершения. Мой вопрос: есть ли удобный способ ограничить количество процессов, которые открывается моей программой сразу?Ограничение количества процессов, выполняемых одновременно подпроцессом. Poken

Код, который я использую, прост, но является частью более крупной программы, поэтому вставка всего кода, необходимого для его запуска, невозможна.

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

Добавление к тому, что было предложено Klaus: Что-то подобное может работать:

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() 
Смежные вопросы