首页 > 代码库 > python非阻塞
python非阻塞
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=http://www.mamicode.com/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=http://www.mamicode.com/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效果是一样的
python非阻塞
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。