IO多路复用
多个socket是否已经发生变化,(是否已经连接成功/是否已经获得数据)(可读/可写)
实现:
- IO多路复用
- 非阻塞
代码如下:
import socket import select client1 = socket.socket() client1.setblocking(False) # 将原本链接阻塞,修改为非阻塞 # 百度创建链接,阻塞 try: client1.connect(('www.baidu.com',80)) except BlockingIOError: pass client2 = socket.socket() client2.setblocking(False) # 将原本链接阻塞,修改为不阻塞 # 百度创建链接,阻塞 try: client2.connect(('www.sogou.com',80)) except BlockingIOError: pass client3 = socket.socket() client3.setblocking(False) # 将原本链接阻塞,修改为不阻塞 # 百度创建链接,阻塞 try: client3.connect(('www.oldboyedu.com',80)) except BlockingIOError: pass socket_list = [client1,client2,client3] conn_list = [client1,client2,client3] while True: rlist,wlist,elist = select.select(socket_list,conn_list,[],0.005) for sk in wlist: if sk == client1: sk.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n') elif sk == client2: sk.sendall(b'GET /web?query=alex HTTP/1.0\r\nhost:www.sogou.com\r\n\r\n') else: sk.sendall(b'GET /s?wd=alex HTTP/1.0\r\nhost:www.oldboyedu.com\r\n\r\n') conn_list.remove(sk) for sk in rlist: chunk_list = [] while True: try: chunk = sk.recv(8096) if not chunk: break chunk_list.append(chunk) except BlockingIOError: break boby = b''.join(chunk_list) print('------->',boby) sk.close() socket_list.remove(sk) if not socket_list: break