2016-10-21 2 views
2

Ich arbeite mit einer kommerziellen Analyse-Software namens Abaqus, die eine Python-Schnittstelle hat, um die Ausgabewerte zu lesen.Parallelisieren eines Codes in Python

Ich habe gerade einen Beispielcode angegeben (die nicht ausgeführt) unter:

myOdb enthält alle Informationen, von denen ich die Daten am extrahieren. Der Nachteil ist, dass ich die Datei nicht mit 2 separaten Programmen öffnen kann.

Der unten gezeigte Code 1 und Code 2 funktionieren unabhängig voneinander, sie benötigen lediglich myOdb.

Gibt es eine Möglichkeit, die Codes 1 und 2 nach dem Lesen der ODB zu parallelisieren?

# 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

Multiprozessing könnte hier helfen. Threads funktionieren möglicherweise nicht, wenn Ihre Python-Implementierung eine Sperre enthält. – shuttle87

+0

Wenn möglich, Könnten Sie mir bitte mit einem Pseudo-Code mit dem obigen Beispiel helfen? – Mechanician

Antwort

2

Wenn alle Sie versuchen zu tun, um eine Grundstufe des Multiprocessing ist zu erreichen, das ist, was Sie brauchen:

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 

Isolieren Sie den „Haupt“ Teil des Codes in einen Hauptblock wie Ich habe oben gezeigt, nicht, und ich meine absolut, verwende keine globalen Variablen. Stellen Sie sicher, dass alle von Ihnen verwendeten Variablen im Namespace jeder Funktion verfügbar sind.

Ich empfehle mehr über Python und das GIL-Problem zu lernen. Lesen Sie über das Multiprocessing-Modul here.

Verwandte Themen