以下のネストループがあります。 どうすれば外部ループを並列化して、外部ループを4回の同時実行に配布し、残りのスクリプトを実行する前に4回の実行が完了するのを待つことができますか?Abaqusを呼び出すPythonでこのネストされたループを並列化する方法
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
は、私が持っている
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
ABAQUS走るshスクリプトにちょうどsubprocess.callではありませんエラーが表示されないので、なぜそこに入っていないのかわかりません。 writeABQfile
は入力ファイルを書いていないので私は知っています。もう一度疑問があります:
外部ループを並列化して、4回の同時実行に外部ループを配布し、4つの実行がすべて完了するのを待ってから、残りのスクリプトを実行します。
@C Panda、 'concurrent.futures'はPython 2.7.10で利用可能です...そうではないようです。残念ながら、それは私が実行しているクラスタで使用できるPythonのバージョンです。 @DavidP。 –
カスタムプロセスプールを使用するのは面倒です。 'concurrent.futures'は、あなたのようなスレッドのようなAPIを与えるために、下にある物事を怖がってしまいます。そのため、カスタムプールを使用してください。 –
@Cパンダ、私はあなたの答えを解決策としてマークしています。ありがとうございました。 私の目的のために、私は[ここ](http://stackoverflow.com/questions/9874042/using-pythons-multiprocessing-module-to-execute-simultaneous-and-separate-seawa)のソリューションと組み合わせました。 –