IO多路復用實現併發伺服器 IO多路復用技術 我們把socket交給操作系統去監控 epoll 是惰性的事件回調:惰性事件回調 是由用戶進程 自己調用的,操作系統只起到 通知的作用,目前Linux上效率最高的 IO多路復用 技術。 併發服務實現: 服務端 客戶端 ...
IO多路復用實現併發伺服器
IO多路復用技術
我們把socket交給操作系統去監控
epoll 是惰性的事件回調:惰性事件回調 是由用戶進程 自己調用的,操作系統只起到 通知的作用,目前Linux上效率最高的 IO多路復用 技術。
併發服務實現:
服務端
import socket import selectors#IO多路選擇器模塊,使用IO多路復用無需設置非阻塞 epoll_selector = selectors.EpollSelector()#用來和epoll通信的選擇器,調用epoll server = 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 socket host = '192.168.215.128' port = 8080 client = 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()