標籤:register lin 啟動 判斷 檔案 sele code exception sock
本節內容
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就會選擇epoll10 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.data36 obj=key.fileobj37 38 func(obj,mask) #1 accept(sock,mask) 2read(conn,mask)39 40 ##用戶端#################41 import socket42 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