首页 > 代码库 > 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非阻塞