并行运行subprocess命令

时间:2018-05-02 07:36:32

标签: python xml matlab

有没有办法可以修改下面的代码来并行执行子流程中的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):

1 个答案:

答案 0 :(得分:0)

一种解决方案是使用带有Queue的python线程。您将XML文件名放入队列中,并拥有一个(5?)个线程池来执行您想要的subprocess.call。这使您可以完全控制。

您可以考虑其他解决方案subprocess.Popen,根据答案here。但我认为这样可以减少对被调用子进程数量的控制。它只会“发射并忘记”。