Seite 1 von 1

threads return

Verfasst: Dienstag 29. November 2005, 21:37
von JanDMC
Moin Leute ,

Ich habe mal wieder ein Problem , was sicher leicht zu lösen ist für euch *g*
Folgendes:

Ich habe eine Methode 'test' diese methode return False oder True.
Da diese methode sehr rechenaufwendig ist , habe ich vor diese in einem thread laufen zu lassen.

normal bekome ich ja das return wenn ich z.b.. > check=test() aufrufe
dann hat 'check' ja True oder False. Wenn ich das aber in einem Thread starte.( thread.start_new_thread(test,(,)) dann gibt mir die methode nicht den wert False oder True , sondern eine int-zahl . die von thread returnt wird. also wenn ich das z.b so mache >> check=thread.start_new_thread(test,(,))...

Wie bekomme ich das return aus der 'test' methode?

danke im voraus.

mfg JanDMC

Verfasst: Mittwoch 30. November 2005, 15:07
von SeB
Was dir

Code: Alles auswählen

check=thread.start_new_thread(test,(,))
zurückliefert ist die ID des gestarteten Threads.

Um das return zu bekommen musst du entweder auf den Thread verzichten oder dein Ergebnis in einer globalen Variable speichern. Letzteres beinhaltet aber einen sehr krassen Seiteneffekt, da du ja nie sicher weißt ob die letzte ausführung der Funktion check schon beendet ist.

Verfasst: Donnerstag 1. Dezember 2005, 00:23
von BlackJack
Wie mein Vorredner schon schrieb, ist das mit der globalen Variable keine gute Idee. Darum packt man die Funktion und das Ergebnis am besten in eine Klasse, die von `threading.Thread` erbt. Das Ergebnis wird dann in einem Attribut gespeichert, von wo man es dann auslesen kann, wenn der Thread, d.h. die Berechnung fertig ist. Ob das Ergebnis schon vorliegt kann man mit `isAlive()` testen oder mit `join()` auf das Ende der Berechnung warten:

Code: Alles auswählen

import time
from threading import Thread

class Worker(Thread):
    def run(self):
        # Komplizierte, lange Berechnung.
        time.sleep(5)
        self.result = 42

worker = Worker()
worker.start()
# Irgendwas anderes.
worker.join()
print worker.result