多路復用 阻塞 非阻塞IO模型 網路IO兩個階段

2022-07-28 17:36:28 字數 1183 閱讀 1643

網路 io模型

2.非阻塞io模型

協程是一種非阻塞io

1.setblocking(false)將阻塞修改非阻塞

2.一旦是非阻塞 在執行accept recv send 就會立馬嘗試讀寫資料 一旦資料沒有準備

好就丟擲異常

3.捕獲異常

4.如果沒有異常說明資料準備好了 直接處理

5.捕獲到異常 那就做別的事情

可以實現單執行緒併發的效果 會大量占用cpu資源

3.多路復用

將所有連線家給select來管理 管什麼? 管哪個連線可以被及處理

作為處理任務的乙方事情變少了 不需要重複不斷的問操作系拿資料 而是等待select返回需要處

理的連線

等待則意味著select是阻塞的

3.1 建立連線和管理連線

1.建立伺服器socket物件

2.將伺服器物件交給select來管理

3.一旦有客戶端發起連線 select將不在阻塞

4.select將返回乙個可讀的socket物件(第一次只有伺服器)

5.伺服器的可讀代表有連線請求 需要執行accept 返回乙個客戶端連線conn 由於是非阻塞 不能立

即去recv

6.把客戶端socket物件也交給select來管理 將conn加入兩個被檢測的列表中

7.下一次檢測到可讀的socket可能是伺服器 也可能是客戶端 所以加上判斷 伺服器就accept 客戶端

就revc

8.如果檢測到有可寫(可以send就是系統快取可用)的socket物件 則說明可以向客戶端傳送資料了

7 and 8 的執行順序是不固定的

3.2 處理資料收發

兩個需要捕獲異常的地方

1.recv 執行第七步 表示可以讀 為什麼異常 只有一種可能是客戶端斷開連線

還需要加上 if not 判斷是否有資料 linux下 對方下線不會丟擲異常 會收到空訊息

2.send 執行第八步 表示可以寫 為什麼異常 只有一種可能客戶端斷開連線

非同步io 不僅僅指網路io 也包括本地io

非阻塞io 和多路復用 解決的都是網路io的阻塞問題

本地io 可以通過子執行緒 或子程序 來避免阻塞 但是對子執行緒或者子程序而言 依舊會阻塞

最終的解決方案就是協程 asyncio 該模組實現非同步io 內部使用協程實現

IO多路復用 非阻塞式IO

目錄 三 多路復用實現 伺服器核心要做的事情是等資料到了我再做事情。伺服器的執行緒處理時間裡面只需要包含資料到了後續部分。這樣最大限度的利用了珍貴的伺服器執行緒資源,並且由於執行緒的處理時間中沒有包含等待資料的時間,可以使得執行緒快速釋放。現實生活中的例子,餐廳,阻塞io類似於每來乙個客人我馬上分配...

非阻塞套接字與IO多路復用

我們了解了socket之後已經知道,普通套接字實現的服務端的缺陷 一次只能服務乙個客戶端!並且,為了使乙個客戶端能夠不斷收發訊息,我們還要使用while迴圈來輪詢,這極大地降低了我們的效率 accept阻塞!在沒有新的套接字來之前,不能處理已經建立連線的套接字的請求 recv 阻塞!在沒有接受到客戶...

非同步 非阻塞和IO多路復用總結

nginx是併發處理框架的代表者,很多後台業務都會放在nginx容器中執行,以實現高吞吐,而nginx能夠支援高併發也是由於使用了非同步非阻塞處理模型,本文將用通俗的話講解非同步 同步 阻塞 非阻塞的區別,以及io多路復用。一 同步和非同步 同步與非同步的重點是在訊息通知的方式上,也就是呼叫後結果通...