IO多路复用_selectors模块_python
一、selectors模块简介
它的功能与linux的epoll,还是select模块,poll等类似;实现高效的I/O multiplexing, 常用于非阻塞的socket的编程中;
相当于封装好的select和epoll,适用于不同的平台,如果支持epoll的平台自动选择epoll,否则会找select。
二、简单的例子:
server:
1 import selectors 2 import socket 3 sel=selectors.DefaultSelector() #创建一个selectors实例 4 5 def interation(conn,mask): 6 ''' 7 :param conn:活跃的conn 8 :return: 9 ''' 10 print(mask) 11 try: 12 data=conn.recv(1024) 13 if data: 14 print('data:',data) 15 conn.send(data) 16 else: 17 print('连接已关闭',conn) 18 sel.unregister(conn) 19 conn.close() 20 except ConnectionResetError as e: 21 print('断开连接',conn) 22 sel.unregister(conn) 23 conn.close() 24 def accept(server,mask): 25 print(mask) 26 conn,addr=server.accept() #生成新的通道 27 conn.setblocking(0) #设置非阻塞模式 28 sel.register(conn,selectors.EVENT_READ,interation) #将通道注册加入检测行列,,设置活跃之后调用interation函数 29 30 31 32 server=socket.socket() 33 server.bind(('localhost',9888)) 34 server.listen() 35 server.setblocking(0) 36 sel.register(server,selectors.EVENT_READ,accept) #将server连接注册 37 38 while True: 39 events=sel.select() #开始进行检测哪些连接有数据 40 #print(events)#[(SelectorKey(fileobj=<socket.socket fd=464, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9888)>, fd=464, events=1, data=<function accept at 0x0000022F8C383048>), 1)] 41 for key,mask in events: #读写操作是否就绪的mask掩码,key是活跃的socket连接 42 callback=key.data #注册时的回调函数,就是获取的accept函数 或者是interation函数 43 callback(key.fileobj,mask) #执行回调函数,key.fileobj文件句柄,相当于生成conn的前一步
client:
#!/usr/bin/env python # _*_ coding:utf-8 _*_ #Author:chenxz import socket def client(): while True: client=socket.socket() client.connect(('localhost',9888)) inputs=input('请输入:') client.send(inputs.encode('utf-8')) receive=client.recv(1024) print(receive) client.close() if __name__ == '__main__': client()