如何在调用 Abaqus 的 Python 中并行化这个嵌套循环
How to parallelize this nested loop in Python that calls Abaqus
我有下面的嵌套循环。 我如何并行化外部循环,以便我可以将外部循环分配到 4 个同时运行中,并等待所有 4 个运行完成,然后再继续执行脚本的其余部分?
for r in range(4):
for k in range( r*nAnalysis/4, (r+1)*nAnalysis/4 ):
# - Write Abaqus INP file - #
writeABQfile(ppos,props,totalTime[k],recInt[k],inpFiles[k],i,lineNum[k],aPath[k])
# - Delete LCK file to Enable Another Analysis - #
delFile(aPath[k]+"/"+inpFiles[k]+".lck")
# - Run Analysis - #
runABQfile(inpFiles[k],aPath[k])
我尝试使用 multiprocess.pool
作为但它永远不会进入:
def parRunABQfiles(nA,nP,r,ppos,prop0,prop1,totalTime2Run_,recIntervals_,inpFiles_,i,lineNumbers_,aPath_):
from os import path
from auxFunctions import writeABQfile, runABQfile
print("I am Here")
for k in range( r*nA/nP, (r+1)*nA/nP ):
# - Write Abaqus INP file - #
writeABQfile(ppos,prop0,prop1,totalTime2Run_,recIntervals_,inpFiles_,i,lineNumbers_,aPath_)
# - Delete LCK file to Enable Another Analysis - #
delFile(aPath_+"/"+inpFiles[k]+".lck")
# - Run Analysis - #
runABQfile(inpFiles_,aPath_)
# - Make Sure Analysis is not Bypassed - #
while os.path.isfile(aPath_+"/"+inpFiles[k]+".lck") == True:
sleep(0.1)
return k
results = zip(*pool.map(parRunABQfiles, range(0, 4, 1)))
runABQfile
只是一个 subprocess.call 到运行 abaqus
的 sh 脚本
def runABQfile(inpFile,path):
import subprocess
import os
prcStr1 = ('sbatch '+path+'/runJob.sh')
process = subprocess.call(prcStr1, stdin=None, stdout=None, stderr=None, shell=True )
return
我没有出现任何错误,所以我不确定为什么没有进入那里。我知道是因为 writeABQfile
不写入输入文件。问题又是:
我如何并行化外部循环,以便我可以将外部循环分配到 4 个同时运行中,并等待所有 4 个运行完成,然后再继续执行脚本的其余部分?
如果您需要多处理,请使用 concurrent.futures
模块。
from concurrent.futures import ProcessPoolExecutor
def each(r):
for k in range( r*nAnalysis/4, (r+1)*nAnalysis/4 ):
writeABQfile(ppos,props,totalTime[k],recInt[k],inpFiles[k],i,lineNum[k],aPath[k])
delFile(aPath[k]+"/"+inpFiles[k]+".lck")
runABQfile(inpFiles[k],aPath[k])
with ProcessPoolExecutor(max_workers=4) as executor:
output = executor.map(each, range(4)) # returns an iterable
如果您只想 "do" 而不是 "produce",请查看同一模块中的 as_completed
函数。文档中有直接示例。
我有下面的嵌套循环。 我如何并行化外部循环,以便我可以将外部循环分配到 4 个同时运行中,并等待所有 4 个运行完成,然后再继续执行脚本的其余部分?
for r in range(4):
for k in range( r*nAnalysis/4, (r+1)*nAnalysis/4 ):
# - Write Abaqus INP file - #
writeABQfile(ppos,props,totalTime[k],recInt[k],inpFiles[k],i,lineNum[k],aPath[k])
# - Delete LCK file to Enable Another Analysis - #
delFile(aPath[k]+"/"+inpFiles[k]+".lck")
# - Run Analysis - #
runABQfile(inpFiles[k],aPath[k])
我尝试使用 multiprocess.pool
作为但它永远不会进入:
def parRunABQfiles(nA,nP,r,ppos,prop0,prop1,totalTime2Run_,recIntervals_,inpFiles_,i,lineNumbers_,aPath_):
from os import path
from auxFunctions import writeABQfile, runABQfile
print("I am Here")
for k in range( r*nA/nP, (r+1)*nA/nP ):
# - Write Abaqus INP file - #
writeABQfile(ppos,prop0,prop1,totalTime2Run_,recIntervals_,inpFiles_,i,lineNumbers_,aPath_)
# - Delete LCK file to Enable Another Analysis - #
delFile(aPath_+"/"+inpFiles[k]+".lck")
# - Run Analysis - #
runABQfile(inpFiles_,aPath_)
# - Make Sure Analysis is not Bypassed - #
while os.path.isfile(aPath_+"/"+inpFiles[k]+".lck") == True:
sleep(0.1)
return k
results = zip(*pool.map(parRunABQfiles, range(0, 4, 1)))
runABQfile
只是一个 subprocess.call 到运行 abaqus
def runABQfile(inpFile,path):
import subprocess
import os
prcStr1 = ('sbatch '+path+'/runJob.sh')
process = subprocess.call(prcStr1, stdin=None, stdout=None, stderr=None, shell=True )
return
我没有出现任何错误,所以我不确定为什么没有进入那里。我知道是因为 writeABQfile
不写入输入文件。问题又是:
我如何并行化外部循环,以便我可以将外部循环分配到 4 个同时运行中,并等待所有 4 个运行完成,然后再继续执行脚本的其余部分?
如果您需要多处理,请使用 concurrent.futures
模块。
from concurrent.futures import ProcessPoolExecutor
def each(r):
for k in range( r*nAnalysis/4, (r+1)*nAnalysis/4 ):
writeABQfile(ppos,props,totalTime[k],recInt[k],inpFiles[k],i,lineNum[k],aPath[k])
delFile(aPath[k]+"/"+inpFiles[k]+".lck")
runABQfile(inpFiles[k],aPath[k])
with ProcessPoolExecutor(max_workers=4) as executor:
output = executor.map(each, range(4)) # returns an iterable
如果您只想 "do" 而不是 "produce",请查看同一模块中的 as_completed
函数。文档中有直接示例。