Threads beenden

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
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

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ß
Benutzeravatar
__blackjack__
User
Beiträge: 13120
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pyzip: Man kann Threads nicht von aussen beenden, das müssen die schon selbst tun.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

Hallo, bitte verzeih, dass ich mit dieser Antwort gar nichts anfangen kann. Wie bitte beendet sich ein Tread selbst???
Danke und Gruß, pyzip
Benutzeravatar
__blackjack__
User
Beiträge: 13120
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
noisefloor
User
Beiträge: 3857
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

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
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

...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
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

...will sagen, dass ich erst dehalb überhaupt auf die Idee gekommen bin, dass ich die Threads aktiv beenden sollte!...
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@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.
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

@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...
narpfel
User
Beiträge: 645
Registriert: Freitag 20. Oktober 2017, 16:10

@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.
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

...und immer, wenn es richtig spannend wird, dann rutscht ein Stecker aus dem KVM-Switch und nichts geht mehr am Bildschirm :-) ...
Antworten