2016-10-21 12 views
2

私は、Abaqusと呼ばれる市販の解析ソフトウェアを使用しています。このソフトウェアには、出力値を読み取るためのPythonインターフェイスがあります。Pythonでコードを並列化する

私はちょうど下の(実行されません)サンプルコードを与えている:

myOdbは、私がデータを抽出しています、そこからすべての情報が含まれています。注意点は、2つの別々のプログラムを使用してファイルを開くことができないということです。

以下に示すコード1とコード2は互いに独立して動作し、必要なのはmyOdbだけです。

odbを読んだ後、コード1とコード2を並列化する方法はありますか?

# Open the odb file 
myOdb = session.openOdb(name=odbPath) 

# Code 1 
for i in range(1, NoofSteps+1): 
    frames = myOdb.steps[stepName].frames 
    lastframe=frames[-1] 
    RFD = lastframe.fieldOutputs['RF'] 

    sum1=0 

    for value in RFD.values: 
     sum1=sum1+value.data[1] 

# Code 2 
for i in range(1, NoofSteps+1): 
    frames = myOdb.steps[stepName].frames 
    lastframe=frames[-1] 

    for j in range(4,13): 
     file2=open('Fp'+str(j)+stepName,'w') 
     b=lastframe.fieldOutputs[var+str(j)] 
     fieldValues=b.values 
     for v in fieldValues: 
      file2.write('%d %6.15f\n' % (v.elementLabel, v.data)) 
+4

ここではマルチプロセッシングが役立つかもしれません。あなたのPythonの実装がロックを保持している場合、スレッドは機能しないかもしれません。 – shuttle87

+0

可能であれば、上記の例で擬似コードを手伝ってもらえますか? – Mechanician

答えて

2

あなたがやろうとしているすべては、マルチプロセッシングの基本的なレベルを達成している場合、これは何が必要です:

import multiprocessing 

#Push the logic of code 1 and code 2 into 2 functions. Pass whatever you need 
#these functions to access as arguments. 

def code_1(odb_object, NoofSteps): 
    for i in range(1, NoofSteps+1): 
    frames = odb_object.steps[stepName].frames 
    #stepName? Where did this variable come from? Is it "i"? 
    lastframe=frames[-1] 
    RFD = lastframe.fieldOutputs['RF'] 

    sum1=0 

    for value in RFD.values: 
     sum1=sum1+value.data[1] 

def code_2(odb_object, NoofSteps): 
    for i in range(1, NoofSteps+1): 
     frames = odb_object.steps[stepName].frames 
     #stepName? Where did this variable come from? Is it "i"? 
     lastframe=frames[-1] 

     for j in range(4,13): 
      file2=open('Fp'+str(j)+stepName,'w') 
      b=lastframe.fieldOutputs[var+str(j)] 
      fieldValues=b.values 
      for v in fieldValues: 
       file2.write('%d %6.15f\n' % (v.elementLabel, v.data)) 

if __name__ == "__main__": 
    # Open the odb file 
    myOdb = session.openOdb(name=odbPath) 
    #Create process objects that lead to those functions and pass the 
    #object as an argument. 
    p1 = multiprocessing.Process(target=code_1, args=(myOdb,NoofSteps,)) 
    p2 = multiprocessing.Process(target=code_2, args=(myOdb,NoofSteps,)) 
    #start both jobs 
    p1.start() 
    p2.start() 
    #Wait for each to finish. 
    p1.join() 
    p2.join() 
    #Done 

のような主要なブロックにあなたのコードの「メイン」部分を分離私は上記に示したとおりではありません。そして、私は絶対にグローバル変数を使用しないことを意味します。使用しているすべての変数が各関数の名前空間で使用可能であることを確認してください。

PythonとGILの問題についてもっと学ぶことをお勧めします。マルチプロセッシングモジュールhereについて読んでください。

関連する問題