[Python-de] threads killn

Olaf Radicke olaf_rad at gmx.de
Mit Okt 29 12:40:59 CET 2003


Hi!

Ich habe einen Thread der an einem Socket lauscht.
Bei der Initialisierung wird ein weiterer Thread
gestartet der den Timeout überwacht. Wenn auf den
Socket zulange gewartet wird, soll der zweite Thread
den ersten killen und dann sich selbst. 

Mein Code funktioniert aber nicht. Die __del__ vom
ersten wird zwar aufgerufen aber die Sau will nicht
krepieren. :-{

MfG
Olaf



-- 
===================================================
"Meine Meinung steht fest. Bitte verwirren sie mich
nicht mit Tatsachen!"
                          Unbekannt.
===================================================
-------------- nächster Teil --------------
#!/usr/bin/python

import answer

import simple_answer
import time
import threading



class Client_Thread(threading.Thread):

    def __init__ (self, channel, info, log):
        threading.Thread.__init__(self)
        
        self.channel = channel
        self.is_session = 0        
        self.info = info
        self.log = log
        self.reply = answer.Answer(self.log, self.info)
        self.erster_kontakt = 1
        self.letzter_kotakt = 0
        #self.timer =
        global tc
        tc = Time_Checker(info, log, channel, self).start()
        
    def get_last_contact(self):
        return self.letzter_kotakt
    
    def run(self):

        while 1:
            question = self.channel.recv(int(self.info.get_max_data_sitz()))
            if not question:
                self.channel.close()
                self.log.warning("Lesen der Klientenanfrage schlug fehl")
                break

            # Zeitstempel
            self.letzter_kotakt = int(time.time())
            

# noch mehr Code
            


            try:
                self.channel.send(answer)
            except:
                self.log.error("Konnte die Antwort nicht zum Klienten schicken.")

            if self.reply.is_end() == 1:
                # sitzung ist mit der Antwort beendet
                break
            print "Cl: und weiter lauschen"
        
        self.channel.close()

    def __del__(self):
        print "killt by freandli fire!"
	self.channel.close()

class Time_Checker(threading.Thread):

    def __init__(self, info, log, channel, zu_ueberwachen):
        threading.Thread.__init__(self)
        self.info = info
        self.log = log
        self.client_contact = zu_ueberwachen
        self.channel = channel
        self.zu_ueberwachen = zu_ueberwachen
        
    def run(self):
        while 1 :
            print "TC: wird geruffen und legt sich schlaffe..."
            time.sleep(30)
            print "TC: prüfe zeit..."
            last_contact = self.client_contact.get_last_contact()
            diferenz = int(time.time()) - last_contact
            
            print "TC: Aktuelle Zeit: ",int(time.time()) 
            print "TC: Letzter Kontakt: ", last_contact
            print "TC: Differrenz: ", diferenz 
            
            # ist die Zeit überschritten worden, dann abbrechen
            print "TC: Vergleiche -",diferenz, "- mit(>) -", self.info.get_max_timeout()
            if diferenz > self.info.get_max_timeout():
            
                print "TC: Zeitüberschreitung..."
                self.log.warning("Zeitüberschreitung. Kontakt zum Klienten wird abgebrochen \
                und der Thread beendet.")
                answer = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"
                answer += "<error>"
                answer += "Zeitüberschreitung. Bitte neu einlogen."
                answer += "</error>"
                try:
                    self.channel.send(answer)
                except:
                    self.log.error("Konnte die Antwort nicht zum Klienten schicken.")

                print "TC: Kille Thread..."
                del self.zu_ueberwachen
                break

            print "TC: Keine Zeitüberschreitung"