IO多路复用实现并发服务器
IO多路复用技术
我们把socket交给操作系统去监控
epoll 是惰性的事件回调:惰性事件回调 是由用户进程 自己调用的,操作系统只起到 通知的作用,目前Linux上效率最高的 IO多路复用 技术。
并发服务实现:
服务端
import socketimport selectors#IO多路选择器模块,使用IO多路复用无需设置非阻塞epoll_selector = selectors.EpollSelector()#用来和epoll通信的选择器,调用epollserver = socket.socket()server.bind(('0.0.0.0',8080))server.listen(1000)def read(connection): recv_data = connection.recv(1024) if recv_data: print(recv_data) connection.send(recv_data) else: epoll_selector.unregister(connection)#数据发送完毕,取消注册无需监控 connection.close()def accept(server): connection,remote_address = server.accept() #要准备收数据 epoll_selector.register(connection,selectors.EVENT_READ,read)epoll_selector.register(server,selectors.EVENT_READ,accept)#连接过来可读的时候在server上注册事件,accept是回调函数#事件循环(主动去问epoll哪些socket可以回调,如果有了,就回调他们)while True: event = epoll_selector.select()#查询所有已经准备好的事件,返回一个列表{ {二元组列表}} for key,mask in event: callback = key.data#从key里面把回调函数拿出来 sock = key.fileobj#从key里面把我们注册的那个socket拿出来 callback(socket)#回调
客户端
import sockethost = '192.168.215.128'port = 8080client = socket.socket()client.connect((host,port))# client.send(b'haha')msg = input('-->')client.send(msg.encode('utf-8'))recv_data = client.recv(1024)print(recv_data.decode('utf-8'))client.close()