[Threading] isAlive() immer true

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
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

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
Zuletzt geändert von rads am Montag 23. August 2010, 13:59, insgesamt 1-mal geändert.
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.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

@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?
Antworten