Seite 1 von 1
Threads beenden
Verfasst: Dienstag 23. Oktober 2018, 19:57
von pyzip
Hallo, ich habe hier und im Net gesucht, aber nichts Wirkliches gefunden. Ich habe ein Skript, in dem mehrere Threads gestartet werden und lasse dort ein Programm mit verschiedenen Parametern laufen(Programm ist als Klasse definiert, d.h. jeder Thread ruft eine Instanz der Klasse auf). Die Threads tauschen sich über "queue's" aus. Das funktioniert...Nun gibt es eine Situation, wo ich den/einen Thread gern beenden möchte, weil das Ergebnis der Berechnungen ganz neue Parameter für das Programm erfordert. Damit will ich anschließend einen neuen Thread starten. Das Einzige, was ich gefunden habe, ist ein Script, in dem ein "t.cancel()" vorkommt. Ansonsten finde ich dieses t.cancel nirgendwo...
Ich hoffe, meine Frage ist einigermassen verständlich und konkret: kann man mit t.cancel einen Thread beenden?
Vielen Dank und Gruß
Re: Threads beenden
Verfasst: Dienstag 23. Oktober 2018, 20:21
von __blackjack__
@pyzip: Man kann Threads nicht von aussen beenden, das müssen die schon selbst tun.
Re: Threads beenden
Verfasst: Dienstag 23. Oktober 2018, 20:48
von pyzip
Hallo, bitte verzeih, dass ich mit dieser Antwort gar nichts anfangen kann. Wie bitte beendet sich ein Tread selbst???
Danke und Gruß, pyzip
Re: Threads beenden
Verfasst: Dienstag 23. Oktober 2018, 20:59
von __blackjack__
@pyzip: Genau wie ein Programm: Wenn der Programmfluss am Ende des gestarteten Moduls angekommen ist, hört ein Programm auf. Und wenn der Programmfluss am Ende der `run()`-Methode oder der Funktion die als `target` beim Erstellen eines Threads angekommen ist, endet auch der Thread.
Re: Threads beenden
Verfasst: Dienstag 23. Oktober 2018, 21:02
von __deets__
Wenn dein Thread eine lange Berechnung ausführt in der du nicht regelmäßig prüfen kannst oder willst, ob er sich beenden soll, dann kannst du ggf auf multiprocessing ausweichen. Da kannst du von außen erzwingen, dass der beendet wird. Mit Threads geht das nicht. Die müssen selbst prüfen & dann eben “auslaufen” wie von BJ schon gesagt.
Re: Threads beenden
Verfasst: Mittwoch 24. Oktober 2018, 08:54
von noisefloor
Hallo,
du kannst dem Thread auf einen Instanz von `threading.Event()` mitgeben, der Thread prüft, ob das Event gesetzt ist und wann ja ist der Fluss des Codes so, dass der Thread zu Ende ist.
Einfaches Beispiel:
Code: Alles auswählen
>>> import threading
>>> from time import sleep
>>> def worker_func(stop_event):
... while not stop_event.is_set():
... print('Thread läuft')
... sleep(5)
... print('Thread beendet')
...
>>> event = threading.Event()
>>> t = threading.Thread(target=worker_func, args=(event, ))
>>> t.start()
Thread läuft
Thread läuft
Thread läuft
>>> event.set()
Thread beendet
>>>
Wenn der Thread Daten über eine Queue bekommst, könntest du das auch darüber machen. Z.B. von du als Daten den String `stop` in die Queue packst, dass der Thread dann entsprechend reagiert.
Gruß, noisefloor
Re: Threads beenden
Verfasst: Mittwoch 24. Oktober 2018, 15:21
von pyzip
Hallo, danke für die vielen Hinweise! Es war mir nicht klar, dass ein Thread sich beendet, wenn das dort laufende Programm "durch" ist! Wie so oft kommt man auf den naheliegenden Gedanken erst mal nicht...
@noisefloor: Im Grunde mache ich das ja schon. Die Threads geben ihre Zwischenergebnisse an zwei Diagrammfenster und senden ein "end", wenn die Berechnung fertig ist. Die Diagramme schließe ich dann mit einem Button. Also kann ich anschließend das ganze Programm mit neuen Parametern aufrufen, ohne daß die alten Threads weiterlaufen(was meine Befürchtung war!).
Danke und Gruß, pyzip
Re: Threads beenden
Verfasst: Mittwoch 24. Oktober 2018, 17:16
von pyzip
...und die Entwicklung eines - für meine Verhältnisse - komplexen Programms bringt nicht nur mich regelmäßig in Bedrullie...Spider 3 braucht nach jedem Testlauf, ob mit oder ohne Fehler, einen "Restart kernel"...sonst passieren die unmöglichsten Dinge! Und auch so fährt mein Ubuntu früher oder später - eher früher - mit der Meldung hoch, dass das System ein Problem hat, das es melden möchte! Immer in Verbindung mit Python 3.x!
Hatte den Eindruck, dass das mit ERIC nicht so war. Aber ERIC kriege ich ums Verrecken nicht mehr installiert!
Danke nochmals, pyzip
Re: Threads beenden
Verfasst: Mittwoch 24. Oktober 2018, 17:19
von pyzip
...will sagen, dass ich erst dehalb überhaupt auf die Idee gekommen bin, dass ich die Threads aktiv beenden sollte!...
Re: Threads beenden
Verfasst: Mittwoch 24. Oktober 2018, 18:26
von narpfel
@pyzip: Meiner Meinung nach ist Spyder nicht als Entwicklungsumgebung für Python geeignet, weil es genau die Art von Problemen hervorruft, die du hast. Grund ist, dass Spyder alle Programme/Testläufe im gleichen Python-Interpreter startet und man so „Übersprecheffekte“ zwischen zwei Programmläufen bekommst, obwohl man das nicht erwartet.
Die am besten funktionierende Möglichkeit, Python-Programme zu entwickeln, ist für mich ein einfacher Texteditor und ein Terminal (das kann auch ein im Editor/in der IDE eingebetteter Terminalemulator sein), in dem das Programm manuell gestartet wird. Die IDE das Programm starten zu lassen, hat öfter mal ungewollte Seiteneffekte.
Re: Threads beenden
Verfasst: Mittwoch 24. Oktober 2018, 18:47
von pyzip
@narpfel: ja, das ist genau meine Erfahrung. Auf der anderen Seite ist es natürlich schön - vor allem als Anfänger - im IDE-Editor jede Menge Hilfe bei der Syntax zu bekommen! Und wie gesagt, mein Eindruck von ERIC ist da deutlich positiver...aber...
Re: Threads beenden
Verfasst: Mittwoch 24. Oktober 2018, 19:24
von narpfel
@pyzip: IDE und das Programm im Terminal starten ist ja auch noch eine Möglichkeit. Und vielleicht ist eine andere IDE (wie zum Beispiel PyCharm) auch stabiler als Spyder.
Re: Threads beenden
Verfasst: Freitag 26. Oktober 2018, 12:38
von pyzip
...und immer, wenn es richtig spannend wird, dann rutscht ein Stecker aus dem KVM-Switch und nichts geht mehr am Bildschirm

...