« »
2008-05-281.Application

247

Python多线程——取局域网的存活IP

这里是顺序去ping 10个主机的Python程序:

  1. import os
  2. import re
  3. import time
  4. import sys
  5.  
  6. lifeline = re.compile(r"(\d) received")
  7. report = ("No response","Partial Response","Alive")
  8.  
  9. print time.ctime()
  10.  
  11. for host in range(60,70):
  12.    ip = "192.168.200."+str(host)
  13.    pingaling = os.popen("ping -q -c2 "+ip,"r")
  14.    print "Testing ",ip,
  15.    sys.stdout.flush()
  16.    while 1:
  17.       line = pingaling.readline()
  18.       if not line: break
  19.       igot = re.findall(lifeline,line)
  20.       if igot:
  21.            print report[int(igot[0])]
  22.  
  23. 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]$

用了28秒,换句话说,等一个无法到达的主机要花3秒钟。

同样的应用,用Python线程来搞
让我们来先写一下并测测看,然后再说明。

  1. import os
  2. import re
  3. import time
  4. import sys
  5. from threading import Thread
  6.  
  7. class testit(Thread):
  8.    def __init__ (self,ip):
  9.       Thread.__init__(self)
  10.       self.ip = ip
  11.       self.status = -1
  12.    def run(self):
  13.       pingaling = os.popen("ping -q -c2 "+self.ip,"r")
  14.       while 1:
  15.         line = pingaling.readline()
  16.         if not line: break
  17.         igot = re.findall(testit.lifeline,line)
  18.         if igot:
  19.            self.status = int(igot[0])
  20.  
  21. testit.lifeline = re.compile(r"(\d) received")
  22. report = ("No response","Partial Response","Alive")
  23.  
  24. print time.ctime()
  25.  
  26. pinglist = []
  27.  
  28. for host in range(60,70):
  29.    ip = "192.168.200."+str(host)
  30.    current = testit(ip)
  31.    pinglist.append(current)
  32.    current.start()
  33.  
  34. for pingle in pinglist:
  35.    pingle.join()
  36.    print "Status from ",pingle.ip,"is",report[pingle.status]
  37.  
  38. 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]$

3秒钟!比起我们一个一个ping、一个一个等来,这个时间非常让人接受了。

您还可能感兴趣的内容

日志信息 »

该日志于2008-05-28 15:49由 x72 发表在1.Application分类下, 通告目前不可用,你可以至底部留下评论。

4条评论

  1. Andy 说道:

    代码有如下问题:
    1、ip的初始状态为alive,最好是No response
    2、打印结果的for循环,可能在完成查询前就已经开始,所以打印出来的结果可能是不对的

    • admin 说道:

      for这个是对线程状态的控制存在问题,此程序只是最基础的测试,还有很多需要考虑的问题,实际应用时要完善的地方还非常多。

  2. Andy 说道:

    消耗资源过多,如果想扫描的网段大一点,感觉。。。。

    • admin 说道:

      你说的确实会存在这个问题,多线程必定会造成内存,CPU等资源的增加,这个是在于如何去控制和优化的问题。

发表评论 »


返回顶部