2016-10-09 1 views
0

Я получил функцию, которая вызывает процесс, используя subprocess.Popen следующим образом:От subprocess.Popen до многопроцессорных

def func(): 
     ... 
     process = subprocess.Popen(substr, shell=True, stdout=subprocess.PIPE) 

     timeout = {"value": False} 
     timer = Timer(timeout_sec, kill_proc, [process, timeout]) 
     timer.start() 

     for line in process.stdout: 
      lines.append(line) 

     timer.cancel() 
     if timeout["value"] == True: 
      return 0 
     ... 

Я называю эту функцию из другой функции с использованием цикла (например, из диапазона (1100)), как я могу сделать несколько вызовов функции с многопроцессорной обработкой? что каждый раз несколько процессов будут выполняться параллельно

Процессы не зависят друг от друга, единственным ограничением является то, что каждый процесс будет «работать» только с одним индексом (например, ни один из двух процессов не будет работать с индексом 1)

Спасибо за вашу помощь

+0

Вы передаете какие-либо аргументы в 'substr'? –

+0

Да, 'substr' отличается при каждом вызове –

+0

Является ли тип process.stdout совместимым с multiprocess.Pipe? –

ответ

1

Просто добавьте индекс к вашему Popen вызова и создать worker pool с таким количеством ядер процессора вы имеете в наличии.

import multiprocessing 

def func(index): 
    .... 
    process = subprocess.Popen(substr + " --index {}".format(index), shell=True, stdout=subprocess.PIPE) 
    .... 

if __name__ == '__main__': 
    p = multiprocessing.Pool(multiprocessing.cpu_count()) 
    p.map(func, range(1, 100)) 
+0

Не нужно передавать параметр 'cpu_count' в' Pool'. По умолчанию Python сделает это за вас. – noxdafox

+0

@noxdafox Спасибо, что обратили внимание! Это было сделано для того, чтобы сделать его более ясным, иначе все будет выглядеть как магия. –