threads return

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JanDMC
User
Beiträge: 95
Registriert: Donnerstag 23. September 2004, 19:35
Kontaktdaten:

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
SeB
User
Beiträge: 25
Registriert: Mittwoch 24. August 2005, 14:29
Wohnort: Buchenau/Hessen
Kontaktdaten:

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.
[url=http://therealzordak.de/index.php]therealzordak.de[/url] - [url=http://therealzordak.de/index.php?section=movies]Movies[/url] - [url=http://therealzordak.de/index.php?section=derwahn]Fun[/url]
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
Antworten