Python之阻塞IO模型與非阻塞IO模型

2022-06-17 20:12:12 字數 2589 閱讀 5659

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模組:

1

import 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)

view code

鏈結

非阻塞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...