1. 程式人生 > >Day15 - Python基礎15 模塊學習-selectors

Day15 - Python基礎15 模塊學習-selectors

acc OS key 模式 style except 查看 支持 平臺

本節內容

1:Python/selectors模塊

2:selsect實例

1:Python/selectors模塊及隊列

selectors模塊是可以實現IO多路復用機制:

它具有根據平臺選出最佳的IO多路機制,比如在win的系統上他默認的是select模式而在linux上它默認的epoll。

常用IO多路復用共分為三種:
 
select、poll、epoll

且windows上只支持select,而linux上都支持

select的缺點:

1、每次調用都要將所有的文件描述符(fd)拷貝的內核空間,導致效率下降

2、遍歷所有的文件描述符(fd)查看是否有數據訪問

3、最大鏈接數限額(1024)

poll:

它就是select和epoll的過渡階段,它沒有最大鏈接數的限額

epoll:

1、第一個函數是創建一個epoll句柄,將所有的描述符(fd)拷貝到內核空間,但只拷貝一次。

2、回調函數,某一個函數或某一個動作成功完成之後會觸發的函數為所有的描述符(fd)綁定一個回調函數,一旦有數據訪問就是觸發該回調函數,回調函數將(fd)放到鏈表中

3、函數判斷鏈表是否為空

4、最大啟動項沒有限額

2:selsect實例:

 1 ###服務端################
 2 
 3 import selectors  #基於select模塊實現的IO多路復用,建議大家使用
4 import socket 5 sock=socket.socket() 6 sock.bind((127.0.0.1,8800)) 7 sock.listen(5) 8 sock.setblocking(False) 9 sel=selectors.DefaultSelector() #根據平臺選擇最佳的IO多路機制,比如linux就會選擇epoll 10 11 def read(conn,mask): 12 try: 13 data=conn.recv(1024) 14 print(data.decode(utf8
)) 15 data2=input(>>>>) 16 conn.send(data2.encode(utf8)) 17 except Exception: 18 sel.unregister(conn) 19 20 def accept(sock,mask): 21 conn,addr=sock.accept() 22 print(-------,conn) 23 sel.register(conn,selectors.EVENT_READ,read) 24 25 sel.register(sock, selectors.EVENT_READ, accept) #註冊功能,一旦有反應繼續往下執行 26 27 while True: 28 print(wating....) 29 events=sel.select() #event和select的監聽對象[(sock),(),()]一樣,都是在監聽 30 31 for key,mask in events: 32 # print(key.data) #accept 找出有活動的綁定函數 33 # print(key.fileobj) #sock 找出有活動的文件描述符 34 35 func=key.data 36 obj=key.fileobj 37 38 func(obj,mask) #1 accept(sock,mask) 2read(conn,mask) 39 40 ##客戶端################# 41 import socket 42 tin=socket.socket() 43 tin.connect((127.0.0.1,8800)) 44 while True: 45 inp=input(>>>>) 46 tin.send(inp.encode(utf8)) 47 data=tin.recv(1024) 48 print(data.decode(utf8))

Day15 - Python基礎15 模塊學習-selectors