select
触发方式
1.水平触发
2.边缘触发
3.IO多路复用的优势:同时可以监听多个连接
边缘触发案例:
1 import socket,select 2 3 tcp_server = socket.socket() 4 tcp_server.bind(('127.0.0.1',8080)) 5 tcp_server.listen(25) 6 inp = [tcp_server,] 7 while True: 8 r,w,p = select.select([tcp_server,],[],[],1) 9 for i in r: 10 # conn,addr = i.accept() 11 # data = conn.recv(1024) 12 # print(data.decode()) 13 print('hello') 14 # inp.append(conn) 15 print('.................')
1 tcp_server = socket.socket() 2 tcp_server.bind(('127.0.0.1',8080)) 3 tcp_server.listen(5) 4 inp = [tcp_server,] 5 while True: 6 r,w,p = select.select(inp,[],[],5) 7 for i in r: 8 if i == tcp_server: 9 conn,addr = i.accept() 10 print(conn) 11 inp.append(conn) 12 else: 13 data = i.recv(1024) 14 print(data.decode()) 15 a = input('给%s返回的信息:'%inp.index(i)) 16 i.sendall(a.encode()) 17 print('goiing......')
改进版
1 import socket,select,threading 2 3 tcp_server = socket.socket() 4 tcp_server.bind(('127.0.0.1',8080)) 5 tcp_server.listen(5) 6 inp = [tcp_server,] 7 def send(i): 8 data = i.recv(1024) 9 print(data.decode()) 10 a = input('给%s返回的信息:' % inp.index(i)) 11 i.sendall(a.encode()) 12 13 while True: 14 r,w,p = select.select(inp,[],[],5) 15 for i in r: 16 if i == tcp_server: 17 conn,addr = i.accept() 18 print(conn) 19 inp.append(conn) 20 else: 21 t = threading.Thread(target=send,args=(i,)) 22 t.start() 23 print('goiing......')
select 就相当于一个班级,40个人同时工作,当有一个人工作完了提交,就拍一下桌子,那么老师就知道有人写完了,但是不知道是哪一个,就得一个一个的去问。
epoll 就相当于自报家门然后提交。