import selectors #導入selectors模式,不一樣於select,它是基於select模塊實現的IO多路複用,import socket #導入的模塊,用於服務端與用戶端的交互sock =socket.socket() #sock.bind(('127.0.0.1',8083)) #sock.listen(5)sock.setblocking(False)sel =selectors.DefaultSelector() #根據使用平臺自動選擇最佳的IO多路複用機制,好比若是 #在linux系統中,它會自動選擇epoll.本系統是在win系統 #上運行的,因此它選擇的是select機制print('sel',sel) #<selectors.SelectSelector object at 0x0000000001E97B70> #sel 是selectors在選擇的IO多路機制下產生的對象def read(conn,mask): try: data =conn.recv(1024) print(data.decode('utf-8')) data2 =input('>>>:').strip() conn.send(data2.encode('utf-8')) except Exception: sel.unregister(conn)def my_accept(sock,mask): #定義函數,函數的參數必須是兩個,第一個是套接字, #第二個是固定的mask,該套接字參數與定義的函數名,在註冊事件時 #要是對應關係的, conn,addr =sock.accept() sel.register(conn,selectors.EVENT_READ,read)#sel.register(sock,selectors.EVENT_READ,my_accept)#註冊事件#sel對象調用register方法,進行註冊,必須輸入三個參數,第一個必須是套接字,#第二個固定是selectors.EVENT_READ,第三個是與套接字綁定的函數名,#即第一個參數和第三個參數是本身設置的#下面的代碼是固定的,不須要更改while True: print('wating.....') events =sel.select() #監聽 [(key1,mask1),(key2,mask2)] #把發生變化的元素賦值給event for key,mask in events: #一旦觸動套接字,就必須執行該函數, obj =key.fileobj #文件描述符(套接字)賦值給obj func =key.data #文件描述符(套接字)綁定的函數賦值給func func(obj,mask) #執行綁定的函數