Seite 1 von 1

[Threading] isAlive() immer true

Verfasst: Montag 23. August 2010, 13:29
von rads
Hallo zusammen,

ich bin gerade etwas über das Verhalten von isAlive verwundert.

Hintergrund:
Ich habe einen Thread der wie ein "Timer" alle n Zeitintervalle eine Aktion ausführen soll

Ziel
Da ich davon ausgehe, dass der Thread beendet werden kann, möchte ich diesen Thread
wieder neu starten, falls er beendet wurde.

Problem
Folgender code stellt in reduzierter Form die angesprochene Timer Klasse dar.

Code: Alles auswählen

  class myMailTimer(Thread):
        def __init__(self, func, sec=5):
            Thread.__init__(self)
            self.func = func
            self.sec = sec
    
        def run(self):
            while True:
                self.func()
                time.sleep(self.sec)
Über folgende "Singelton - Nachahmung" kontrolliere ich den Zustand des Timers.

Code: Alles auswählen

    def _TimerIsStillAlive(self):
        try:
            if  not self.env.mailtimer.isAlive():
                self.env.mailtimer.start()
        except AttributeError, e:
            self.env.mailtimer = self.myMailTimer(self._sendAllMails,
                                                  self.DEFAULT_SLEEP_TIME)
            self.env.mailtimer.start()
            self.log.debug ( "Mail Timer was activated." )
Simulation
Nun Starte ich wie üblich das Python programm und der thread arbeitet wie gewollt.
Über das Tool Sysinternals process monitor "kille" ich geziehlt den entsprechenden
Thread im Pyhton Prozess.
Leider liefert die Methode isAlive() bzw. is_alive() trotzdem weiterhin True zurück.

Könnt mir jemand auf die Sprünge helfen, was ich hier nicht bedenke?


Vielen Dank schonmal

Grüße

Stefan

Re: [Threading] isAlive() immer true

Verfasst: Montag 23. August 2010, 13:52
von BlackJack
@rads: Wenn ich das richtig verstanden habe, killst Du den Thread mit einem externen Werkzeug von aussen -- wovon der nichts mitbekommt -- und wunderst Dich dass der getötete Thread seinen eigenen Zustand nicht mehr ordnungsgemäss aktualisiert hat!? Laufende Threads über nicht vorgesehende Wege zu töten ist keine gute Idee.

Re: [Threading] isAlive() immer true

Verfasst: Montag 23. August 2010, 13:56
von rads
@BalckJack

Danke für die Antwort, ja das hast du schon richtig verstanden. An sich möchte ich so testen, wenn der Thread aus einen "unerklärlichen" Grund ungewollt beendet wird, ob ich dies mitbekomme und gegebenen Falls wieder korrigieren kann.
Ehrlich gesagt rechne ich von der isAlive Anfrage weder mit einem True noch mit einen False, sondern mit einer ordenlichn Exception. Aber offenbar wird der Thread - Context in der python laufzeitumgebung zwischengespeichert?

An sich geht es mir hier eigentlich nur darum, kleine Fehler durch die Anwendung selber beheben zu lassen, um die Zuverlässigkeit zu steigern.

Aber wahrscheinlich müsste ich das Pferd ganz anders aufsatteln?