Запустите команду подпроцесса параллельно - PullRequest
0 голосов
/ 02 мая 2018

Есть ли способ, которым я мог бы изменить приведенный ниже код для параллельного выполнения команды matlab field solver в строке подпроцесса?

Приведенный ниже код анализирует XML-файл и создает 8000 его копий с разными именами файлов и изменениями параметров в соответствии с циклами for, а затем вызывает решатель полей Matlab для последовательного решения каждого из них.

Запуск их последовательно занимает много времени и просто утомительно, поэтому мне было интересно, есть ли способ изменить это так, чтобы он открывал 4-5 терминалов и запускал 4-5 XML-файлов параллельно? Это действительно уменьшит время запуска всех этих файлов.

from lxml import etree as ET
#import xml.etree.ElementTree as ET
import subprocess
import os
def frange(start, end, step):
    tmp = start
    while(tmp <= end):
        yield tmp
        tmp += step

#print os.getcwd()
os.chdir('C:\Users\Aravind_Sampathkumar\Desktop\IMLC')
#print os.getcwd()
fileCount = 1
tree = ET.parse('C:\Users\Aravind_Sampathkumar\Desktop\IMLC\BO\IMLC_v4p8_Aravind.xml')
#tree = ET.fromstring(xml)
root = tree.getroot()
#print(root.attrib)
#    print child.tag, child.attrib
#import py2exe

#print root[3].attrib
for child in root.iter('Traces'):
    child.find('TS')
    child.find('TW')
    for i in frange(3,12.75,0.25):
        child.set('TS',str(i))
        for k in frange(3,12.75,0.25):
                child.set('TW',str(i))
                for child2 in root.iter('Stackup'):
                    child2.find('core_h')
                    for j in frange(2,4,0.5):
                        for child3 in root.iter('Definition'):
                            child3.set('modelname', 'Output{}.xml'.format(fileCount))
                        child2.set('core_h',str(j))
                        tree.write('C:\Users\Aravind_Sampathkumar\Desktop\IMLC\BO\Output{}.xml'.format(fileCount))
                        subprocess.call(['imlc.exe','C:\Users\Aravind_Sampathkumar\Desktop\IMLC\BO\Output{}.xml'.format(fileCount)],shell=True)
                        fileCount = fileCount+1

       # for j in frange(2,4,0.5):

1 Ответ

0 голосов
/ 02 мая 2018

Одним из решений было бы использование потоков Python с Queue . Вы помещаете имена файлов XML в очередь и имеете пул (5?) Потоков, выполняющих требуемый вызов subprocess.call. Это дает вам полный контроль.

Другое решение, которое вы можете рассмотреть как подпроцесс. Открыто в соответствии с ответом здесь . Но я думаю, что это дает вам меньше контроля над количеством вызываемых подпроцессов. Он просто «выстрелит и забудет».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...