Параллельный запуск команды подпроцесса

Есть ли способ изменить приведенный ниже код для параллельного выполнения команды решателя поля 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
545
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Я думаю, что использование потоков было бы лучше, чем Popen. Спасибо за ответ!

Potato 02.05.2018 10:56

Другие вопросы по теме