1 IO多路复用
作用:IO多路复用的作用是检测多个soket是否已经发生变化(是否已经连接成功,是否已经获取数据)(可读/可写)
操作系统检测soket是否发生变化的三种模式:
select:最多有1024个soket,循环去检测
poll:不限制监听的soket个数,循环去检测(水平触发)
epoll:不限制监听soket个数,回调方式(边缘触发)
python模块:select.select select.epoll
1 import socket 2 import select 3 client1=socket.socket() 4 client1.setblocking(False) 5 try: 6 client1.connect(('www,baidu.com',80)) 7 except BlockingIOError as e: 8 pass 9 client2=socket.socket() 10 client2.setblocking(False) 11 try: 12 client2.connect(('www.sogou.com',80)) 13 except BlockingIOError as e: 14 pass 15 16 socket_list=[client1,client2] 17 conn_list=[client1,client2] 18 19 while True: 20 rlist,wlist,elist=select.select(socket_list,conn_list,[],0.005) #relsit种有值表示有返回的数据(可读) 21 # wlist有值表示已经连接成功(可写),elist表示是否有异常,有异常则放里面,0.005表示的是每测一次最多花0.005 22 for sk in wlist: #表示wlist种有值,即表示连接成功 23 if sk==client1: 24 sk.sendall(b'GET /s?wd=alex HTTP/1.0 host:www.baidu.com ') 25 else: 26 sk.sendall(b'GET /s?wd=alex HTTP/1.0 host:www.sogou.com ') 27 conn_list.remove(sk) #表示将连接成功的数据剔除,已经连接过了,不用再次连接。 28 29 for sk in rlist:#表示rlist种有值,有返回的数据 30 chun_list=[] #将返回的数据放到列表中 31 while True: 32 try: 33 chun=sk.recv(1024) 34 if not chun: #表示接收到的数据已经接收完,没有数据可接收了 35 break 36 chun_list.append(chun) #有数据的话 将数据放入到列表中 37 except BlockingIOError as e: 38 break 39 body=b''.join(chun_list) #将列表中的数据以字节的形式展现出来 40 print('________>',body) 41 sk.close() 42 socket_list.remove(sk) 43 if not socket_list: 44 break