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.
thread beenden
@Sync32: Du müsstest ihm halt irgend etwas über die Queue schicken, dass ihn veranlasst sich selbst zu beenden.
Ich habe sowas immer auf diese Weise gelöst:
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
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"
Gruß,
brb
@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 .....BlackJack hat geschrieben:@Sync32: Wieso vorher leeren? Ich denke das Problem war gerade dass die Queue leer ist und `get()` deswegen blockiert!?
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 ....
@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.
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.
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.