第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原創,歡迎關注,帶你一起長知識。