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) #执行绑定的函数