settimeout
setblocking+select(了解select)
继续昨天的干活,这次我使用select+setblocking和settimeout来做个对比,以次来证明。
首先我设置socket为非阻塞的。然后使用select来监控套接字。
#!/usr/bin/env python# encoding: utf-8import socketimport threadingimport Queueimport timeimport selectclass worker(threading.Thread): def __init__(self,name,queue): self.data=queue super(worker,self).__init__(name=name) def run(self): for i in range(10000): self.data.put(i)class customer(threading.Thread): def __init__(self,name,queue): super(customer,self).__init__(name=name) self.data=queue def scan(self,ip,port): s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setblocking(False) #s.settimeout(0.1) results=s.connect_ex((ip,port)) #print results a,b,c=select.select([],[s,],[s,],0.1)#设置超时时间0.1秒,这里我根据前面博文的总结得出来的。 #当connect连接成功的时候,代表Tcp3次握手完成,此时变成可写状态 if b:#如果socket可写,代表了端口是开放的 print port s.close() def run(self): while True: try: a=self.data.get(1,5) except: break else: ip=‘220.181.136.241‘ self.scan(ip,a)def main(): start=time.time() queue=Queue.Queue() pool=[] worke=worker(‘firebroo‘,queue) worke.start() for i in range(100): a=customer(‘firebroo‘,queue) pool.append(a) for i in pool: i.start() worke.join() for i in pool: i.join() print time.time()-start del pool[:]if __name__==‘__main__‘: main()
大概花费17.5秒执行完毕。下面我使用settimeout。
#!/usr/bin/env python# encoding: utf-8import socketimport threadingimport Queueimport timeimport selectclass worker(threading.Thread): def __init__(self,name,queue): self.data=queue super(worker,self).__init__(name=name) def run(self): for i in range(10000): self.data.put(i)class customer(threading.Thread): def __init__(self,name,queue): super(customer,self).__init__(name=name) self.data=queue def scan(self,ip,port): s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #s.setblocking(False) s.settimeout(0.1)#为了和前面保持一致,当然得设置0.1秒 results=s.connect_ex((ip,port)) if results==0:#connect_ex中0代表端口开放,3次握手完成 print port #print results #a,b,c=select.select([],[s,],[s,],0.1)#设置超时时间0.1秒,这里我根据前面博文的总结得出来的。 #当connect连接成功的时候,代表Tcp3次握手完成,此时变成可写状态 #if b:#如果socket可写,代表了端口是开放的 # print port s.close() def run(self): while True: try: a=self.data.get(1,5) except: break else: ip=‘220.181.136.241‘ self.scan(ip,a)def main(): start=time.time() queue=Queue.Queue() pool=[] worke=worker(‘firebroo‘,queue) worke.start() for i in range(100): a=customer(‘firebroo‘,queue) pool.append(a) for i in pool: i.start() worke.join() for i in pool: i.join() print time.time()-start del pool[:]if __name__==‘__main__‘: main()
时间大概是17.4。这两个测试结果应该可以说是一样的,难免会有误差。
总结:由此我可以说Python的settimeout这个API确实是非阻塞。和select+setblocking效果是一样的
时间: 2025-01-12 23:07:57