Threading: Fehlerhafte Rückgabe, wie den Fehler suchen
Verfasst: Donnerstag 2. Juli 2009, 11:07
Hallo,
ich habe Probleme mit einer Anwendung, in der ich Threads verwende um AUfgaben verteilt berechnen zu lassen. Die verteilte Berechnung funktioniert so, dass ich einen Thread abspalte der dann durch mpiexec auf anderen Prozessoren rechnet. Nach Ende der Berechnungen sollen durch ein join die Threads vereint und die Ergebnisliste gebaut werden.
Ich gebe kurz an wie das Prinzip des Threads aussieht:
Das ist das wesentliche: Er führt für eine Anzahl von "Partikeln" eine Funktion aus, die irgendetwas berechnet und daraus ein "Gewicht" (einfach einen Zahlenwert) je Partikel berechnet und im Partikel speichert.
Die Funktion zum Verteilen der Threads sieht ungefähr so aus:
Wieder auf das wesentliche vereinfacht.
Ich teile also die Gesamtanzahl Partikel auf Listen auf, die den Threads gegeben werden und dann rechnet jeder für sich an seinem Satz Partikel herum.
Der Thread funktioniert auch, also das print p.weight spuckt Zahlen aus. Jetzt kommt es aber bei dem zweiten print in der obigen Funktion manchmal vor, dass für ein Partikel plötzlich weight 0 ausgegen wird, und die Zahlen für die folgenden Partikel viel zu hoch ist, und ganz anders als die im Thread berechnete Zahl.
Ich weiß nicht, wo das herkommt oder wie ich überhaupt anfangen kann, den Fehler zu suchen, habt ihr dazu einen Tipp?
ich habe Probleme mit einer Anwendung, in der ich Threads verwende um AUfgaben verteilt berechnen zu lassen. Die verteilte Berechnung funktioniert so, dass ich einen Thread abspalte der dann durch mpiexec auf anderen Prozessoren rechnet. Nach Ende der Berechnungen sollen durch ein join die Threads vereint und die Ergebnisliste gebaut werden.
Ich gebe kurz an wie das Prinzip des Threads aussieht:
Code: Alles auswählen
class filterThread (threading.Thread):
'''single thread that runs particles on one processor'''
def __init__(self, aParticles, fEndTime):
threading.Thread.__init__(self)
self.aParticles = aParticles
def run(self):
for p in self.aParticles:
p.observe()
print p.weight
Die Funktion zum Verteilen der Threads sieht ungefähr so aus:
Code: Alles auswählen
#(...)
threads = []
for key in partPartition.keys():
thread = filterThread(partPartition[key], t)
threads.append(thread)
for np in range(iProc):
threads[np].start()
for np in range(iProc):
threads[np].join()
for p in threads[np].aParticles:
print p.weight
Ich teile also die Gesamtanzahl Partikel auf Listen auf, die den Threads gegeben werden und dann rechnet jeder für sich an seinem Satz Partikel herum.
Der Thread funktioniert auch, also das print p.weight spuckt Zahlen aus. Jetzt kommt es aber bei dem zweiten print in der obigen Funktion manchmal vor, dass für ein Partikel plötzlich weight 0 ausgegen wird, und die Zahlen für die folgenden Partikel viel zu hoch ist, und ganz anders als die im Thread berechnete Zahl.
Ich weiß nicht, wo das herkommt oder wie ich überhaupt anfangen kann, den Fehler zu suchen, habt ihr dazu einen Tipp?