Threading und das Beenden von Threads

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
B-Baer
User
Beiträge: 23
Registriert: Donnerstag 5. August 2010, 11:56

Hallo
in einer Appl. generiere ich dynamisch Threads, der Thread ist wie folgt aufbebaut.

Code: Alles auswählen

class MyThread(threading.Thread):  
    go= True
   
    def __init__(self): 
        #do something
        pass

    def run(self):
        while(self.go):
              #do something
              pass
     
     def stop(self):
         self.go = False
Nachdem ich einige dieser Threads gestartet habe möchte ich alle Threads
nach einer gewissen nicht festen Zeit abbrechen.
Leider hilft mir meine stop() Methode nicht weiter...

Hat jemand ne Idee wie ich meine Threads beenden kann?
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

würde doch so ehen wie du es mache wolltest.
Nur musst du "stop" auch aufrufen.

Besser wäre es noch wenn du "go" mit dem Konstrucktor initialisierst.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

@B-Baer: Technisch ist das Problem hier, dass die `stop()`-Methode ein neues Attribut auf dem `MyThread` erzeugt auf dem sie aufgerufen wurde. `self` ist ja genau dieses Objekt.

Wenn Du ein Klassenattribut setzen oder abfragen möchtest, dann solltest Du das auch über das Klassenobjekt tun.

Letztlich möchte man das aber in der Regel nicht. Klassenattribute die keine Konstanten sind, haben ähnliche Probleme wie "globale" Variablen und sollten vermieden werden. Sauberer wäre es sich die Threads zu merken und auf jedem einzeln `stop()` aufzurufen.
Benutzeravatar
br3z3l
User
Beiträge: 10
Registriert: Mittwoch 30. Januar 2008, 21:31
Kontaktdaten:

Prinzipiell geht es mit deinem Ansatz, werden allerdings im Thread Funktionen aufgerufen die lange blockieren, wird der Thread auch erst nachdem die Funktion fertig ist beendet.

Code: Alles auswählen

while self.go:
    some_very_long_action() # läuft obwohl self.go schon lange auf false
    # erst hier kann Thread sich beenden
Eine Möglichkeit einen Thread direkt zu töten gibt es afaik (leider) nicht.
Antworten