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 就相当于自报家门然后提交。

原文地址:https://www.cnblogs.com/ch2020/p/12805806.html