Seite 1 von 1

Thread von außen beenden

Verfasst: Sonntag 14. März 2021, 17:11
von maksimilian
Hallo Ihr,

das Thema ist sicher schon oft behandelt worden. Die Situation bei mir ist folgende:
In einem Thread läuft ein kleiner TCP-Server basierend auf dem socket-Modul. Er wartet mit accept() auf den (einzigen) Client. Wenn das Skript, in welchem der Thread läuft, mit KeyInterrupt beendet werden soll, erfordert das aufgrund des blockierenden accept 2x Strg+C, um auch den Thread zu beenden. Es gäbe zwar die Möglichkeit den accept mit setblocking unterbrechbar zu machen, um dann z.B. ein threading.Event abfragen zu können, was den Nachteil hätte, ihn permanent in einer Zeitschleife aufrufen zu müssen.

Welche Konstruktion würde es erlauben, den Thread bei blockierendem accept von außen sauber zu beenden ?

maksimilian

Re: Thread von außen beenden

Verfasst: Sonntag 14. März 2021, 17:44
von Sirius3
Warum hast Du überhaupt einen Thread?

Re: Thread von außen beenden

Verfasst: Sonntag 14. März 2021, 18:30
von DasIch
maksimilian hat geschrieben: Sonntag 14. März 2021, 17:11 Welche Konstruktion würde es erlauben, den Thread bei blockierendem accept von außen sauber zu beenden ?
Die Frage hast du dir im Prinzip schon selbst beantwortet:
Es gäbe zwar die Möglichkeit den accept mit setblocking unterbrechbar zu machen, um dann z.B. ein threading.Event abfragen zu können, was den Nachteil hätte, ihn permanent in einer Zeitschleife aufrufen zu müssen.
Eine Alternative wäre dazu noch ein timeout auf dem Socket zu haben aber das Prinzip dass der Thread kooperiert bleibt.

Es gibt zwar Möglichkeiten einen Thread von außen zu beenden aber dass ist nichts was auch nur annähernd sauber wäre. Stell dir z.B. mal vor der Thread hält gerade ein Lock (muss nicht unbedingt dein Code sein kann auch ein Lock irgendwo im Interpreter oder so sein) und du killst den Thread. Du bist da eigentlich sofort im Bereich von potenziellen Deadlocks und undefiniertem Verhalten.

Re: Thread von außen beenden

Verfasst: Montag 15. März 2021, 10:10
von maksimilian
Sirius3 hat geschrieben: Sonntag 14. März 2021, 17:44 Warum hast Du überhaupt einen Thread?
Wegen der notwendigen Bereitschaft, auf andere Ereignisse als die vom Client reagieren zu müssen. Für die Fragestellung spielt das aber keine Rolle.

Re: Thread von außen beenden

Verfasst: Montag 15. März 2021, 10:12
von maksimilian
DasIch hat geschrieben: Sonntag 14. März 2021, 18:30 Eine Alternative wäre dazu noch ein timeout auf dem Socket zu haben aber das Prinzip dass der Thread kooperiert bleibt.
/quote]

Das wäre immer noch besser als die Lösung mit setblocking. Wie sieht da die Syntax aus ?

Re: Thread von außen beenden

Verfasst: Montag 15. März 2021, 10:43
von Sirius3
@maksimilian: natürlich spielt das für die Fragestellung eine Rolle. Wenn es möglich ist, würde man nämlich erst gar nicht mit Threads anfangen.
Asynchrone Programmierung wäre da so eine Alternative.

Ansonsten einfach Serversocket schließen.

Re: Thread von außen beenden

Verfasst: Dienstag 16. März 2021, 10:59
von DasIch

Re: Thread von außen beenden

Verfasst: Mittwoch 28. April 2021, 11:20
von maksimilian
Das Thema hat sich erledigt.