2016-05-11 5 views
0

以下のネストループがあります。 どうすれば外部ループを並列化して、外部ループを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つの実行がすべて完了するのを待ってから、残りのスクリプトを実行します。

答えて

1

マルチプロセッシングが必要な場合は、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 

あなただけではなく、「農産物」よりもものを「やる」と同じモジュールからas_completed機能をチェックアウトします。このドキュメントには直接の例があります。

+0

@C Panda、 'concurrent.futures'はPython 2.7.10で利用可能です...そうではないようです。残念ながら、それは私が実行しているクラスタで使用できるPythonのバージョンです。 @DavidP。 –

+0

カスタムプロセスプールを使用するのは面倒です。 'concurrent.futures'は、あなたのようなスレッドのようなAPIを与えるために、下にある物事を怖がってしまいます。そのため、カスタムプールを使用してください。 –

+0

@Cパンダ、私はあなたの答えを解決策としてマークしています。ありがとうございました。 私の目的のために、私は[ここ](http://stackoverflow.com/questions/9874042/using-pythons-multiprocessing-module-to-execute-simultaneous-and-separate-seawa)のソリューションと組み合わせました。 –

関連する問題