python學記筆記 2 非同步IO

2022-07-25 06:21:08 字數 1505 閱讀 7163

在io程式設計中,我們知道cpu的速度遠遠快於磁碟,網路io,在乙個執行緒中,cpu執行速度的**非常快,然而遇到io操作就需要阻塞

需要等待io操作完成才能繼續下一步的動作。這種情況叫做同步io

在io操作的過程中,當前執行緒被掛起,而其他需要cpu執行的**就無法被當前執行緒執行。

因為乙個io阻塞了當前執行緒,導致後邊的**無法執行,我們必須使用多執行緒或者多程序來併發執行**,為多個使用者服務,

每個使用者分配乙個執行緒,如果遇到io導致執行緒被掛起,其他使用者的縣城不受影響

多執行緒和多程序模型確實解決了併發問題,但是系統不能無上限的只能加執行緒,執行緒間切換的開銷也很大,當有很多執行緒時候,cpu的

由於我們要解決的問題是cpu告訴執行能力和io裝置的龜速嚴重不匹配,多執行緒和多程序只是一種方法。

另一種方法是非同步io,當**需要執行乙個耗時的io操作的時候,它執法處io指令並不等待io結果,然後去執行其他**,

一端時間後io操作完成會通知相關執行緒cpu在進行處理

普通的**至無法完成非同步io的。

do_some_code()

f = open('

/path/to/file

', 'r'

)r = f.read() #

<== 執行緒停在此處等待io操作結果

#io操作完成後執行緒才能繼續執行:

do_some_code(r)

所以,同步io的模型是無法實現非同步io模型的。

非同步io模型需要乙個訊息迴圈,在訊息迴圈中,主線程不斷的重複讀取訊息處理訊息這個過程

loop =get_event_loop()

while

true:

event =loop.get_event()

process_event(event)

訊息模型其實早在應用在桌面應用程式中了。乙個gui程式的主線程就負責不停地讀取訊息並處理訊息。所有的鍵盤、滑鼠等訊息都被傳送到gui程式的訊息佇列中,然後由gui程式的主線程處理。

由於gui執行緒處理鍵盤、滑鼠等訊息的速度非常快,所以使用者感覺不到延遲。某些時候,gui執行緒在乙個訊息處理的過程中遇到問題導致一次訊息處理時間過長,此時,使用者會感覺到整個gui程式停止響應了,敲鍵盤、點滑鼠都沒有反應。這種情況說明在訊息模型中,處理乙個訊息必須非常迅速,否則,主線程將無法及時處理訊息佇列中的其他訊息,導致程式看上去停止響應。

訊息模型是如何解決同步io必須等待io操作這一問題的呢?當遇到io操作時,**只負責發出io請求,不等待io結果,然後直接結束本輪訊息處理,進入下一輪訊息處理過程。當io操作完成後,將收到一條「io完成」的訊息,處理該訊息時就可以直接獲取io操作結果。

在「發出io請求」到收到「io完成」的這段時間裡,同步io模型下,主線程只能掛起,但非同步io模型下,主線程並沒有休息,而是在訊息迴圈中繼續處理其他訊息。這樣,在非同步io模型下,乙個執行緒就可以同時處理多個io請求,並且沒有切換執行緒的操作。對於大多數io密集型的應用程式,使用非同步io將大大提公升系統的多工處理能力

LINUX學記筆記4

今日學習內容為 管道符 重定向與環境變數 1 輸入 輸出重定向 簡而言之,輸入重定向是指把檔案匯入到命令中,而輸出重定向則是指把原本要輸出到螢幕的資料資訊寫入到指定檔案中。在日常的學習和工作中,相較於輸入重定向,我們使用輸出重定向的頻率更高,所以又將輸出重定向分為了標準輸出重定向和錯誤輸出重定向兩種...

LINUX學記筆記5

今日主要學習內容為如何編寫shell指令碼和流程控制語句 1 編寫簡單的指令碼 shell指令碼命令的工作方式有兩種,分別是 互動式和批處理 互動式 與人進行互動輸入操作的方式執行命令 批處理 輸入命令後,不用人為進行操作一次性將命令執行得出結果 shell指令碼主要分為三部分,分別是 指令碼宣告 ...

angular 學用標記 筆記

npm install g angular cli ng serve open ng serve命令會構建本應用 啟動開發伺服器 監聽原始檔,並且當那些檔案發生變化時重新構建本應用。open標誌會開啟瀏覽器 ng update 你還可以使用 cli 命令ng update發現 angular 的最新...