假设我们要检查本地网络中哪些IP地址是可达的哪些是不可达的,我们可以用循环来实现,也可以用线程来实现。
不用线程的实现方式:
#!/usr/bin/python
import os, re, threading, commands, time
status = ["no respones","alive, but 50% package loss","alive","shouldn't occur"]
received_packages = re.compile(r"(\d) received")
for suffix in range(20,29):
ip = "10.170.9."+str(suffix)
ping_out = os.popen("ping -c 2 " + ip ,"r")
while True:
line = ping_out.read()
if not line:
break
n_received = re.findall(received_packages, line)
if n_received:
print "Status from ", ip, " is ", status[int( n_received[0])],time.ctime(time.time())
执行结果:
Status from 10.170.9.20 is alive Fri Apr 17 13:57:03 2015
Status from 10.170.9.21 is no respones Fri Apr 17 13:57:06 2015
Status from 10.170.9.22 is no respones Fri Apr 17 13:57:09 2015
Status from 10.170.9.23 is no respones Fri Apr 17 13:57:12 2015
Status from 10.170.9.24 is no respones Fri Apr 17 13:57:15 2015
Status from 10.170.9.25 is alive Fri Apr 17 13:57:16 2015
Status from 10.170.9.26 is alive Fri Apr 17 13:57:17 2015
Status from 10.170.9.27 is alive Fri Apr 17 13:57:18 2015
Status from 10.170.9.28 is no respones Fri Apr 17 13:57:22 2015
用线程的实现方式:
#!/usr/bin/python
import os, re, threading, commands, time
class ip_check(threading.Thread):
def __init__(self, ip):
threading.Thread.__init__(self)
self.ip = ip
self.__successful_pings = -1
def run(self):
ping_out = os.popen("ping -c 2 " + self.ip ,"r")
while True:
line = ping_out.read()
if not line:
break
n_received = re.findall(received_packages, line)
if n_received:
self.__successful_pings = int( n_received[0])
def status(self):
if self.__successful_pings == 0:
return "no respones"
elif self.__successful_pings == 1:
return "alive, but 50% package loss"
elif self.__successful_pings == 2:
return "alive"
else:
return "shouldn't occur"
received_packages = re.compile(r"(\d) received")
check_results = []
for suffix in range(20,29):
ip = "10.170.9."+str(suffix)
current = ip_check(ip)
check_results.append(current)
current.start()
for el in check_results:
el.join()
print "Status from ", el.ip, " is ", el.status(),time.ctime(time.time())
执行结果:
Status from 10.170.9.20 is alive Fri Apr 17 13:57:39 2015
Status from 10.170.9.21 is no respones Fri Apr 17 13:57:41 2015
Status from 10.170.9.22 is no respones Fri Apr 17 13:57:41 2015
Status from 10.170.9.23 is no respones Fri Apr 17 13:57:41 2015
Status from 10.170.9.24 is no respones Fri Apr 17 13:57:41 2015
Status from 10.170.9.25 is alive Fri Apr 17 13:57:41 2015
Status from 10.170.9.26 is alive Fri Apr 17 13:57:41 2015
Status from 10.170.9.27 is alive Fri Apr 17 13:57:41 2015
Status from 10.170.9.28 is no respones Fri Apr 17 13:57:41 2015
无线程和有线程的结果分析:
有线程的耗时是: 2秒
无线程的耗时是:19秒
线程的方式明显比无线程的快将近10倍。如果在要处理的数据量更大的情况下,线程的处理方式的优势更明显。