Seite 1 von 1
thread beenden
Verfasst: Montag 24. Oktober 2011, 12:19
von Sync32
Ich starte ein Thread,
der eine Dauerschleife beinhaltet und ständig Daten aus einem Queue ausliest.
Also der hängt in der Schleife in einem q.get() fest und wartet bis da neuer Stuff reinkommt.
Problem ist nur, wie beende ich diesen Thread?
Von allein beendet der sich ja nicht, weil er in einer Dauerschleife hängt.
Ein Event geht auch nicht, weil er im .get() festhängt.
Hab das Teil auch als daemon=True definiert. Aber bringt leider auch nichts.
Re: thread beenden
Verfasst: Montag 24. Oktober 2011, 12:40
von BlackJack
@Sync32: Du müsstest ihm halt irgend etwas über die Queue schicken, dass ihn veranlasst sich selbst zu beenden.
Re: thread beenden
Verfasst: Montag 24. Oktober 2011, 12:43
von Barabbas
Ich habe sowas immer auf diese Weise gelöst:
Code: Alles auswählen
while True:
try:
job = myqueue.get(timeout=1)
except Queue.Empty:
continue
if job == "EXIT":
return
else:
print "mache irgendwelche arbeit"
Das Ganze kann man natürlich noch erweitern. Beispielsweise möchtest du vll. den Queue leeren, bevor du den "EXIT"-Job anhängst, damit der Thread nicht erst noch alle vorherigen Jobs abarbeitet - aber das ist halt Abhängig davon, was du tun willst. Außerdem funktioniert das natürlich nicht, wenn "mache irgendwelche Arbeit" irgendwelche minutenlangen Berechnungen sind, die würden dann erst durchlaufen, bevor der EXIT-Job greift.
Gruß,
brb
Re: thread beenden
Verfasst: Montag 24. Oktober 2011, 12:45
von Sync32
BlackJack hat geschrieben:@Sync32: Du müsstest ihm halt irgend etwas über die Queue schicken, dass ihn veranlasst sich selbst zu beenden.
Sehr gute Idee! Danke
Bräuchte nur ne Möglichkeit, den Queue vorher zu leeren.
Re: thread beenden
Verfasst: Montag 24. Oktober 2011, 12:53
von Barabbas
Naja, dazu würde man vermutlich solange queue.get(block=False) ausführen, bis Queue.Empty geworfen wird

Re: thread beenden
Verfasst: Montag 24. Oktober 2011, 13:10
von BlackJack
@Sync32: Wieso vorher leeren? Ich denke das Problem war gerade dass die Queue leer ist und `get()` deswegen blockiert!?
Re: thread beenden
Verfasst: Montag 24. Oktober 2011, 13:24
von Sync32
BlackJack hat geschrieben:@Sync32: Wieso vorher leeren? Ich denke das Problem war gerade dass die Queue leer ist und `get()` deswegen blockiert!?
Ne dann hätte ich ja einfach mit der empty() Methode arbeiten können. Also if empty() dann .....
Aber der Queue kann ja zwischendurch leer sein.
Sobald da neue Daten reinkommen, soll der Thread diese verwerten.
Wenn ich die Anwendung jetzt beende, obwohl mein Queue noch Daten hat, müssen die Daten natürlich erstmal wieder geleert werden. Bevor ich mein "Schlüsselwort" putte, die den Thread beendet.
Also if x.get() == "beendemich" dann ....
Re: thread beenden
Verfasst: Montag 24. Oktober 2011, 13:55
von Barabbas
Hast du jetzt eigentlich noch irgendwelche Fragen? Alles, was du möchtest, ist mit den hier besprochenen Funktionen umsetzbar. Einfach mal etwas ausprobieren...
Re: thread beenden
Verfasst: Montag 24. Oktober 2011, 14:08
von BlackJack
@Sync32: Dann kombiniere doch einfach: Ein Flag setzen zum Beenden und um sicher zu stellen, dass das auch „gesehen“ wird, einen Dummy-Wert in die Queue schreiben.
Re: thread beenden
Verfasst: Montag 24. Oktober 2011, 15:01
von Sync32
Ich hab mir da was kleines gebastelt aber leider funktioniert das nicht.
Denn mein .empty() greift nicht. Der returnt nichts und bleibt an der Stelle hängen.
empty()
Return True if the queue is empty, False otherwise. Because of multithreading/multiprocessing semantics, this is not reliable.