2016-07-24 7 views
0

Im Python documentation on multiprocessing gibt es zahlreiche Beispiele für die Parallelisierung der Arbeit einer Funktion. Ich nahm an, es wäre auch möglich, dies einer in einer Klasse enthaltenen Funktion zu tun. Das folgende Beispiel funktioniert jedoch nicht. Erzeugt für Prozesse, die die Multiplikation von 2 der aktuellen Prozessnummer berechnen. Die Berechnung des berechneten Werts innerhalb des Objekts funktioniert, wenn ich jedoch versuche, den berechneten Wert nach Abschluss der Jobs zu erhalten, meldet er nur den im Konstruktor festgelegten Wert zurück.Aufruf einer Funktion innerhalb einer Klasse statt Funktion mit Multiprocessing in Python

Klassendefinition

import multiprocessing 


class MyClass(): 

    def __init__(self,runname): 
     self.runname = runname 
     self.output = 0 



    def calculate(self,input): 
     self.output = input*2 
     print "Reporting from runname %s, calculation yielded %s" % (self.runname,self.output) 


    def getOutput(self): 
     return self.output 

Code, um das Objekt zu nennen:

objectList = [] #Store objects 
jobList = [] #Store multiprocessing objects 

#Run the workers in 4 parallel processes 
for i in range(4): 

    thisRunname = 'Worker:%s' % i 
    thisInstance = MyClass(thisRunname) 

    p = multiprocessing.Process(target=thisInstance.calculate, args=(i,)) 

    jobList.append(p) 
    p.start() 
    objectList.append(thisInstance) 

for thisJob in jobList: #Wait till all jobs are done 
    thisJob.join() 

print "Jobs finished" 

for thisInstance in objectList: 
    print "Worker %s calculated %s " % (thisInstance.runname,thisInstance.getOutput()) 

Diese Ausgänge:

Reporting from runname Worker:0, calculation yielded 0 
Reporting from runname Worker:1, calculation yielded 2 
Reporting from runname Worker:2, calculation yielded 4 
Reporting from runname Worker:3, calculation yielded 6 
Jobs finished 
Worker Worker:0 calculated 0 
Worker Worker:1 calculated 0 
Worker Worker:2 calculated 0 
Worker Worker:3 calculated 0 

So kann die calculate Funktion ohne Problem hervorgebracht werden, wenn sie versuchen, Um den berechneten Wert zu erhalten, gibt es nur ba ck 0, der Wert, auf den es im Konstruktor gesetzt wurde.

Gibt es ein Schlüsselkonzept, das ich vermisse, wie ist es möglich, den Selbstausgangswert zu erhalten?

+1

Vielleicht helfen diese (Jeder Subprozess aktualisiert seine eigene Kopie von MyClass .output und daher ist die Ausgabe des Hauptprozesses nicht betroffen): http://StackOverflow.com/questions/16244745/how-to-use-classes-with- python-multiprocessing, http://stackoverflow.com/questions/32666559/cannot-change-class-variables-with-multiprocessing-process-object-in-python3 – mkaran

Antwort

1

Die von der Process-Klasse zur Verfügung gestellte Serialisierung ist nur in einer Richtung. Es wird die target und args serialisieren Sie geben es, aber es bringt nichts automatisch zurück.

Also, wenn Sie Ihre Process es schaffen, die multiprocessing Modul Pickles die MyClass Instanzen, die Sie erstellt haben (da die target s Methoden der Instanzen gebunden sind) und jeder wird sie in einem der untergeordneten Prozesse ungebeizte. Deshalb führt jedes der Kinder die Berechnung wie erwartet durch.

Die Änderungen an der Version des untergeordneten Prozesses der Instanz werden jedoch nicht in den Hauptprozess zurückkopiert. Es gibt einfach keinen Mechanismus dafür. Am Ende werden die Instanzen weggeworfen, wenn der Kindprozess endet. Die Instanzen des übergeordneten Prozesses MyClass werden nicht aktualisiert, weshalb Sie die calculated 0 Nachrichten sehen.

Verwandte Themen