TheGrudge
12-10-2005, 10:24
Hallo,
ich lerne gerade ein bisserl Python und wollte nun mal ein Beispiel mit Threads ausprobieren.
Da ist ein Programm, das mittels einer for-Schleife einen IP-Bereich überprüft per ping und aufgrund einer RegEx eine Statusmeldung ausgibt.
Lasse ich das Programm ohne Threads laufen, funktioniert es, dauert so an die 2 Minuten.
Nun soll in dem Tutorial eine Klasse erstellt werden, die von "Thread" abgeleitet wird, angeblich dauert das Programm dann nur noch 20 Sekunden.
Aber leider hängt sich Python nach dem ersten Ping immer auf und ich muss alle übrigen Pings per
killall -9 ping beenden.
Das ist ja wohl eher nicht der Sinn des Beispiels, aber ich bekomme es einfach nicht hin. Vielleicht findet ihr den Fehler?
Ich benutze Python2.3 unter Debian Sarge, ist da vielleicht thread-mode oder sowas nicht einkompiliert??
Hier mal das Programm (die erste IP im Bereich ist momentan Google, sollte also funktionieren):
import os
import re
import time
import sys
from threading import Thread
class testit(Thread):
def __init__ (self,ip):
Thread.__init__(self)
self.ip = ip
self.status = -1
def run(self):
pingaling = os.popen("ping -q -c2 "+self.ip,"r")
while 1:
line = pingaling.readline()
if not line: break
igot = re.findall(lifeline,line)
if igot:
self.status = int(igot[0])
lifeline = re.compile(r"(\d) received")
report = ("No response","Partial Response","Alive")
print time.ctime()
pinglist = []
for host in range(104,160):
ip = "66.249.93."+str(host)
current = testit(ip)
pinglist.append(current)
current.start()
for pingle in pinglist:
pingle.join()
print "Status from ",pingle.ip,"is",report[pingle.status]
print time.ctime()
ich lerne gerade ein bisserl Python und wollte nun mal ein Beispiel mit Threads ausprobieren.
Da ist ein Programm, das mittels einer for-Schleife einen IP-Bereich überprüft per ping und aufgrund einer RegEx eine Statusmeldung ausgibt.
Lasse ich das Programm ohne Threads laufen, funktioniert es, dauert so an die 2 Minuten.
Nun soll in dem Tutorial eine Klasse erstellt werden, die von "Thread" abgeleitet wird, angeblich dauert das Programm dann nur noch 20 Sekunden.
Aber leider hängt sich Python nach dem ersten Ping immer auf und ich muss alle übrigen Pings per
killall -9 ping beenden.
Das ist ja wohl eher nicht der Sinn des Beispiels, aber ich bekomme es einfach nicht hin. Vielleicht findet ihr den Fehler?
Ich benutze Python2.3 unter Debian Sarge, ist da vielleicht thread-mode oder sowas nicht einkompiliert??
Hier mal das Programm (die erste IP im Bereich ist momentan Google, sollte also funktionieren):
import os
import re
import time
import sys
from threading import Thread
class testit(Thread):
def __init__ (self,ip):
Thread.__init__(self)
self.ip = ip
self.status = -1
def run(self):
pingaling = os.popen("ping -q -c2 "+self.ip,"r")
while 1:
line = pingaling.readline()
if not line: break
igot = re.findall(lifeline,line)
if igot:
self.status = int(igot[0])
lifeline = re.compile(r"(\d) received")
report = ("No response","Partial Response","Alive")
print time.ctime()
pinglist = []
for host in range(104,160):
ip = "66.249.93."+str(host)
current = testit(ip)
pinglist.append(current)
current.start()
for pingle in pinglist:
pingle.join()
print "Status from ",pingle.ip,"is",report[pingle.status]
print time.ctime()