Есть ли способ изменить приведенный ниже код для параллельного выполнения команды решателя поля matlab в строке подпроцесса?
Приведенный ниже код анализирует 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):
Одним из решений было бы использование потоковой передачи Python с Очередь. Вы помещаете имена XML-файлов в очередь и имеете пул из (5?) Потоков, выполняющих нужный subprocess.call. Это дает вам полный контроль.
Другое решение, которое вы могли бы рассмотреть, subprocess.Popen согласно ответу здесь. Но я думаю, что это дает вам меньше контроля над количеством вызываемых подпроцессов. Он просто выстрелит и забудет.
Я думаю, что использование потоков было бы лучше, чем Popen. Спасибо за ответ!