IO多路复用,以socket为例

import selectors  #导入selectors模式,不同于select,它是基于select模块实现的IO多路复用,
import socket #导入的模块,用于服务端与用户端的交互
sock =socket.socket() #
sock.bind(('127.0.0.1',8083)) #
sock.listen(5)
sock.setblocking(False)
sel =selectors.DefaultSelector() #根据使用平台自动选择最佳的IO多路复用机制,比如如果
#在linux系统中,它会自动选择epoll.本系统是在win系统
#上运行的,所以它选择的是select机制

print('sel',sel) #<selectors.SelectSelector object at 0x0000000001E97B70>
#sel 是selectors在选择的IO多路机制下产生的对象
def read(conn,mask):
try:
data =conn.recv(1024)
print(data.decode('utf-8'))
data2 =input('>>>:').strip()
conn.send(data2.encode('utf-8'))
except Exception:
sel.unregister(conn)

def my_accept(sock,mask): #定义函数,函数的参数必须是两个,第一个是套接字,
#第二个是固定的mask,该套接字参数与定义的函数名,在注册事件时
#要是对应关系的,
conn,addr =sock.accept()
sel.register(conn,selectors.EVENT_READ,read)


#
sel.register(sock,selectors.EVENT_READ,my_accept)#注册事件
#sel对象调用register方法,进行注册,必须输入三个参数,第一个必须是套接字,
#第二个固定是selectors.EVENT_READ,第三个是与套接字绑定的函数名,
#即第一个参数和第三个参数是自己设置的


#下面的代码是固定的,不需要更改
while True:
print('wating.....')
events =sel.select() #监听 [(key1,mask1),(key2,mask2)]
#把发生变化的元素赋值给event
for key,mask in events: #一旦触动套接字,就必须执行该函数,
obj =key.fileobj #文件描述符(套接字)赋值给obj
func =key.data #文件描述符(套接字)绑定的函数赋值给func
func(obj,mask) #执行绑定的函数
原文地址:https://www.cnblogs.com/IQ-Python/p/6845821.html