Python多线程——取局域网的存活IP
这里是顺序去ping 10个主机的Python程序:
- import os
- import re
- import time
- import sys
- lifeline = re.compile(r"(\d) received")
- report = ("No response","Partial Response","Alive")
- print time.ctime()
- for host in range(60,70):
- ip = "192.168.200."+str(host)
- pingaling = os.popen("ping -q -c2 "+ip,"r")
- print "Testing ",ip,
- sys.stdout.flush()
- while 1:
- line = pingaling.readline()
- if not line: break
- igot = re.findall(lifeline,line)
- if igot:
- print report[int(igot[0])]
- print time.ctime()
运行它,虽然它工作正常,但是有些慢。
[trainee@buttercup trainee]$ python alive
Mon May 9 05:22:51 2005
Testing 192.168.200.60 No response
Testing 192.168.200.61 No response
Testing 192.168.200.62 No response
Testing 192.168.200.63 No response
Testing 192.168.200.64 No response
Testing 192.168.200.65 No response
Testing 192.168.200.66 Alive
Testing 192.168.200.67 No response
Testing 192.168.200.68 No response
Testing 192.168.200.69 No response
Mon May 9 05:23:19 2005
[trainee@buttercup trainee]$
Mon May 9 05:22:51 2005
Testing 192.168.200.60 No response
Testing 192.168.200.61 No response
Testing 192.168.200.62 No response
Testing 192.168.200.63 No response
Testing 192.168.200.64 No response
Testing 192.168.200.65 No response
Testing 192.168.200.66 Alive
Testing 192.168.200.67 No response
Testing 192.168.200.68 No response
Testing 192.168.200.69 No response
Mon May 9 05:23:19 2005
[trainee@buttercup trainee]$
用了28秒,换句话说,等一个无法到达的主机要花3秒钟。
同样的应用,用Python线程来搞
让我们来先写一下并测测看,然后再说明。
- 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(testit.lifeline,line)
- if igot:
- self.status = int(igot[0])
- testit.lifeline = re.compile(r"(\d) received")
- report = ("No response","Partial Response","Alive")
- print time.ctime()
- pinglist = []
- for host in range(60,70):
- ip = "192.168.200."+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()
接下来,运行:
[trainee@buttercup trainee]$ python kicking
Mon May 9 05:23:36 2005
Status from 192.168.200.60 is No response
Status from 192.168.200.61 is No response
Status from 192.168.200.62 is No response
Status from 192.168.200.63 is No response
Status from 192.168.200.64 is No response
Status from 192.168.200.65 is No response
Status from 192.168.200.66 is Alive
Status from 192.168.200.67 is No response
Status from 192.168.200.68 is No response
Status from 192.168.200.69 is No response
Mon May 9 05:23:39 2005
[trainee@buttercup trainee]$
Mon May 9 05:23:36 2005
Status from 192.168.200.60 is No response
Status from 192.168.200.61 is No response
Status from 192.168.200.62 is No response
Status from 192.168.200.63 is No response
Status from 192.168.200.64 is No response
Status from 192.168.200.65 is No response
Status from 192.168.200.66 is Alive
Status from 192.168.200.67 is No response
Status from 192.168.200.68 is No response
Status from 192.168.200.69 is No response
Mon May 9 05:23:39 2005
[trainee@buttercup trainee]$
3秒钟!比起我们一个一个ping、一个一个等来,这个时间非常让人接受了。
4条评论▼