ich überlege gerade, wie ich mein Programm am besten mit Python parallelisiere. Ich habe ein 2D Array in dem alle Daten gespeichert werden, im Prinzip könnte sich jeder Thread / Prozess ein Stück nehmen und es befüllen, das Problem ist nur, dass nicht alle Threads am selben Array arbeiten können, oder? D.h. ich müsste die einzelnen Arrays der Threads nach der Bearbeitung wieder in das gesamte Daten-Array überführen.
Das Problem ist nur: Ich hab mir mühe gegeben, das Projekt in Objekte zu kapseln, ich hab nun eine Klasse "Renderer" die das gesamte Rendering inklusive dem 2D-Array als Datenbasis kapselt, dieser Renderer enthält eine Referenz auf ein QWidget, dass die Daten im 2D Array anzeigt (es sind Farbwerte für jeden Pixel). Angenommen ich würde einen neuen Thread erstellen, dann wüsste ich erstmal nicht, wie ihm die gesamte Funktionalität des Renderer-Objekts zur Verfügung stelle, da es nur ein Renderer-Objekt gibt, können dann auch wieder nicht 4 Thread-Objekte am selben Renderer-Objekt arbeiten, oder?
Mit Multiprocessing geht das sowieso nicht, da Klassenmethoden nicht "gepickled" werden können.
Mein Ansatz mit Threads sieht aktuell so aus:
Code: Alles auswählen
def calculate(self):
thrds = []
for x in range(0,4):
startWidth = int(x*self.width / 4)
wLength = int(self.width / 4)
startHeight = int(x*self.height / 4)
hLength = int(self.height / 4)
t = threading.Thread(target=self.calculateInRange,args=(startWidth,wLength,startHeight,hLength))
t.start()
thrds.append(t)
for t in thrds:
t.join()
Code: Alles auswählen
def calculateInRange(self,startW,wLength,startH,hLength):
i = startW * self.height + startH;
for w in range(startW,wLength):
for h in range(startH,hLength):
color = self.computeSample(w,h)
self.buffer[i * 3 + 0] += color.r
self.buffer[i * 3 + 1] += color.g
self.buffer[i * 3 + 2] += color.b
i += 1
Nachdem der Thread aus dieser Methode "run" zurück zu "calculateInRange" kehrt, sind auf einmal alle Variablen (also startW, wLength,startH,hLength,w und h) auf '0' gesetzt, keine Ahnung wieso und wie ich das ändern kann. :K