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?
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