本节内容
1:Python/selectors模块
2:selsect实例
1:Python/selectors模块及队列
selectors模块是可以实现IO多路复用机制:
它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默认的epoll。
常用IO多路复用共分为三种:
select、poll、epoll
且windows上只支持select,而linux上都支持
select的缺点:
1、每次调用都要将所有的文件描述符(fd)拷贝的内核空间,导致效率下降
2、遍历所有的文件描述符(fd)查看是否有数据访问
3、最大链接数限额(1024)
poll:
它就是select和epoll的过渡阶段,它没有最大链接数的限额
epoll:
1、第一个函数是创建一个epoll句柄,将所有的描述符(fd)拷贝到内核空间,但只拷贝一次。
2、回调函数,某一个函数或某一个动作成功完成之后会触发的函数为所有的描述符(fd)绑定一个回调函数,一旦有数据访问就是触发该回调函数,回调函数将(fd)放到链表中
3、函数判断链表是否为空
4、最大启动项没有限额
2:selsect实例:
1 ###服务端################ 2 3 import selectors #基于select模块实现的IO多路复用,建议大家使用 4 import socket 5 sock=socket.socket() 6 sock.bind(('127.0.0.1',8800)) 7 sock.listen(5) 8 sock.setblocking(False) 9 sel=selectors.DefaultSelector() #根据平台选择最佳的IO多路机制,比如linux就会选择epoll 10 11 def read(conn,mask): 12 try: 13 data=conn.recv(1024) 14 print(data.decode('utf8')) 15 data2=input('>>>>') 16 conn.send(data2.encode('utf8')) 17 except Exception: 18 sel.unregister(conn) 19 20 def accept(sock,mask): 21 conn,addr=sock.accept() 22 print('-------',conn) 23 sel.register(conn,selectors.EVENT_READ,read) 24 25 sel.register(sock, selectors.EVENT_READ, accept) #注册功能,一旦有反应继续往下执行 26 27 while True: 28 print('wating....') 29 events=sel.select() #event和select的监听对象[(sock),(),()]一样,都是在监听 30 31 for key,mask in events: 32 # print(key.data) #accept 找出有活动的绑定函数 33 # print(key.fileobj) #sock 找出有活动的文件描述符 34 35 func=key.data 36 obj=key.fileobj 37 38 func(obj,mask) #1 accept(sock,mask) 2read(conn,mask) 39 40 ##客户端################# 41 import socket 42 tin=socket.socket() 43 tin.connect(('127.0.0.1',8800)) 44 while True: 45 inp=input('>>>>') 46 tin.send(inp.encode('utf8')) 47 data=tin.recv(1024) 48 print(data.decode('utf8'))