selectors模块是可以实现IO多路复用机制:
它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默认的epoll。
select模块,提供了:select、poll、epoll三个方法,分别调用系统的 select,poll,epoll 从而实现IO多路复用。
Windows Python:
提供: select Mac Python:
提供: select Linux Python:
提供: select、poll、epoll格式:rList,wList,eList = select.select(argv1,argv2,argv3,timeout)
参数:
argv1:监听序列中的句柄发生变化时,则获取发生变化的句柄添加到rList序列中
argv2:监听序列中含有句柄时,则将该序列中所有的句柄添加到wList序列中
argv3:监听序列中的句柄发生错误时,则将该发生错误的句柄添加到eList序列中
timeout:设置阻塞时间,如果不设置则默认一直阻塞
概念:
监听多个描述符的状态,如果描述符状态改变,则会被内核修改标志位,从而被进程获取进而进行读写操作
服务端 import selectors #基于select模块实现的IO多路复用,建议大家使用 import socket sock=socket.socket() sock.bind(('127.0.0.1',8800)) sock.listen(5) sock.setblocking(False) sel=selectors.DefaultSelector() #根据平台选择最佳的IO多路机制,比如linux就会选择epoll def read(conn,mask): try: data=conn.recv(1024) print(data.decode('utf8')) data2=input('>>>>') conn.send(data2.encode('utf8')) except Exception: sel.unregister(conn) def accept(sock,mask): conn,addr=sock.accept() print('-------',conn) sel.register(conn,selectors.EVENT_READ,read) sel.register(sock, selectors.EVENT_READ, accept) #注册功能 while True: print('wating....') events=sel.select() #[(sock),(),()] 监听 for key,mask in events: # print(key.data) #accept 找出有活动的绑定函数 # print(key.fileobj) #sock 找出有活动的文件描述符 func=key.data obj=key.fileobj func(obj,mask) #1 accept(sock,mask) 2read(conn,mask) ------------------------------------------------------------------------------ 客户端 import socket tin=socket.socket() tin.connect(('127.0.0.1',8800)) while True: inp=input('>>>>') tin.send(inp.encode('utf8')) data=tin.recv(1024) print(data.decode('utf8'))