python之阻塞io模型與非阻塞io模型
io模型
1 阻塞io:
全程阻塞
2 非阻塞io:
傳送多次系統呼叫:
優點:wait for data時無阻塞
缺點:1 系統呼叫太多 2 資料不是實時接受的
兩個階段:wait for data:非阻塞
copy data :阻塞
3 io多路復用(監聽多個連線)
sock::sock
對於檔案描述符(套接字物件):
1 是乙個非零整數,不會變
2 收發資料的時候,對於接收端而言,資料先到核心空間,
然後copy到使用者空間,同時,核心空間資料清除。
特點:1 全程(wait for data,copy)阻塞
2 能監聽多個檔案描述符
實現併發
io多路復用的實現機制:
win:select
linux:select and poll or epoll (有epoll用epoll,沒有則select)
select的缺點:
1、每次呼叫select 都要將所有的fd(檔案描述符)拷貝到核心空間。從而導致效率下降。
2、遍歷所有的fd,是否有資料訪問。浪費時間(最重要的問題)
3、最大連線數(1024)
poll:
1、最大連線數沒有限制。這是和select最大的區別。
epoll:
內部通過三個函式實現的。
1、第乙個函式:建立乙個epoll控制代碼。方便將fd以一次性的拷到核心去。but,只需要拷貝一次。
2、第二個函式:**函式,在某乙個函式或動作完成後會觸發的函式。為所有的fd繫結乙個**函式。
一旦有資料訪問,就會觸發該**函式,**函式將fd放到列表中。
3、第三個函式:判斷列表是否為空。
沒有最大鏈結數。
4 非同步io
全程無阻塞
5 驅動訊號
總結:
同步: 阻塞io 非阻塞io io多路復用
非同步: 非同步io
selectors模組:
1view codeimport selectors #
基於select模組實現的io多路復用,建議大家使用23
import
socket
45 sock=socket.socket()
6 sock.bind(("
127.0.0.1
",8800))
78 sock.listen(5)910
sock.setblocking(false)
1112 sel=selectors.defaultselector() #
根據具體平台選擇最佳io多路機制,比如在linux,選擇epoll
1314
defread(conn,mask):
1516
try:
17 data=conn.recv(1024)
18print(data.decode("
utf8"))
19 data2=input("
>>>")
20 conn.send(data2.encode("
utf8"))
21except
exception:
22sel.unregister(conn)
2324
defaccept(sock,mask):
2526 conn, addr =sock.accept()
27print("
conn
",conn)
28sel.register(conn,selectors.event_read,read)
2930 sel.register(sock,selectors.event_read,accept) #
註冊事件
3132
while 1:
3334
print("
wating...")
35 events=sel.select() #
監聽 [(key1,mask1),(key2,mask2)]
36for key,mask in
events:
3738
#print(key.fileobj) # conn39#
print(key.data) # read
40 func=key.data
41 obj=key.fileobj
4243 func(obj,mask) #
1 accept(sock,mask) # 2 read(conn,mask)
鏈結
非阻塞IO模型
include include include include include include in.h include include include include include using namespace std define maxsize 2048std queue socketqu...
io模型 非阻塞模型
linux下,可以通過設定socket使其變為non blocking。當對乙個non blocking socket執行讀操作時,流程是這個樣子 從圖中可以看出,當使用者程序發出read操作時,如果kernel中的資料還沒有準備好,那麼它並不會block使用者程序,而是立刻返回乙個error。從使...
阻塞IO與非阻塞IO
阻塞io,當前程序因不滿足一些條件,而被掛起,即阻塞,cpu改去服務其它程序,read乙個普通檔案,就馬上執行,read乙個滑鼠,可是滑鼠沒有動,於是就阻塞了,阻塞的好處,利於os效能的發揮,cpu發揮高,雖然個體的費了點時間,但是總的效率得到了提高,阻塞在多路io的時候,缺陷就出來了,比如2路io...