[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"