Seite 1 von 1

Threading und das Beenden von Threads

Verfasst: Mittwoch 20. Oktober 2010, 09:21
von B-Baer
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?

Re: Threading und das Beenden von Threads

Verfasst: Mittwoch 20. Oktober 2010, 09:44
von Xynon1
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.

Re: Threading und das Beenden von Threads

Verfasst: Mittwoch 20. Oktober 2010, 09:46
von 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.

Re: Threading und das Beenden von Threads

Verfasst: Mittwoch 20. Oktober 2010, 15:51
von br3z3l
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.