IO多路複用,以socket爲例

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)   #執行綁定的函數
相關文章
相關標籤/搜索