第95p,最常見的4種網路IO模型

大家好,我是

楊數

Tos

,這是《從零基礎到大神》系列課程的第95篇文章,第三階段的課程:Python進階知識:網路程式設計的IO模型知識。

IO模型描述的是程式等待使用者輸入時處理資料的方式。

注:本文只涉及網路IO模型,IO模型有多種,這裡只介紹4種常見的IO模型。

一、阻塞IO

阻塞IO可以稱為“一根筋”,

當呼叫recv()函式時,系統首先查是否有準備好的資料。

如果資料沒有準備好,那麼系統就處於等待狀態。

當資料準備好後,將資料從系統緩衝區複製到使用者空間,然後該函式返回。在套接應用程式中,當呼叫recv()函式時,未必使用者空間就已經存在資料,那麼此時recv()函式就會處於等待狀態。

二、非阻塞IO

非阻塞IO就比較靈活一點,提交請求後,無論是否有資料,都會立刻得到一個結果 ;

等待資料階段(accept),就不會影響程式的執行;

1、傳送請求accept,無論什麼情況,都會給一個recv;

2、因為一直是在執行態與就緒態之間,CPU不會處於IO阻塞狀態。

三、IO多路複用

IO多路複用是由作業系統提供一個監管機制,能夠監管socket物件和conn物件,只要有人觸發了,立刻就返回可執行的物件;

但當監管的物件只有一個的時候,IO多路複用的效率比阻塞IO還低;

不過,IO多路複用可以同時監管N個物件;

這個監管機制是由作業系統提供的,常見的監管機制有select機制(wint和linux都有)、epoll機制(只有linux有,epoll就是非同步回撥機制);

注:select和poll都可以監管多個物件,但是poll可以監管更多的物件。

四、非同步IO

應用只需要向核心傳送一個read請求,告訴核心它要讀取資料後即刻返回;

核心收到請求後會建立一個訊號聯絡,當資料準備就緒,核心會主動把資料從核心複製到使用者空間,等所有操作都完成之後;

核心會發起一個通知告訴應用,我們稱這種模式為非同步IO模型。

在Python中實現非同步的方式也比較簡單,使用async和await關鍵字就可以輕鬆實現非同步。

Pythin中常用的非同步框架,包括:sanic、tornado、Twisted。

其實,IO模型更重要的是理解其中的概念,具體的執行過程和專業術語不需要死記硬背。

阻塞IO模型是一根筋,傳送請求,必須等到資料,否則它會一直在等;

非阻塞IO模型很靈活,傳送請求,不管有沒有資料它都會返回結果;

IO多路複用是“大戶人家”,一個人搞不定,那我招幾萬個“人”來幫忙不就行了嗎?(多執行緒)

非同步IO是時間管理大師,把N個執行緒管理的有條不紊、井然有序。

以上是本期內容,如果有表達不對的內容,歡迎您的留言、斧正,我們一起天天向上。

感謝您的閱讀,您的三連【關注、點贊、收藏】就是對我最大的支援,謝謝!

本文由楊數Tos原創,歡迎關注,帶你一起長知識。