python 執行緒的五個狀態
當程式中包含多個執行緒時,CPU 不是一直被特定的執行緒霸佔,而是輪流執行各個執行緒。
那麼,CPU 在輪換執行執行緒的過程中,即從建立到消亡的整個過程,可能會歷經 5 種狀態,分別是新建、就緒、執行、阻塞和死亡。
執行緒的新建狀態
無論是通過 Thread 類直接例項化物件建立執行緒,還是通過繼承自 Thread 類的子類例項化建立執行緒,新建立的執行緒在呼叫 start() 方法之前,不會得到執行,此階段的執行緒就處於新建狀態。
執行緒的就緒狀態
當位於新建狀態的執行緒呼叫 start() 方法後,該執行緒就轉換到就緒狀態。
所謂就緒,就是告訴 CPU,該執行緒已經可以執行了,但是具體什麼時候執行,取決於 CPU 什麼時候排程它。
換句話說,如果一個執行緒處於就緒狀態,只能說明此執行緒已經做好了準備,隨時等待 CPU 排程執行,並不是說執行了 start() 方法此執行緒就會立即被執行。
執行緒的執行狀態
當位於就緒狀態的執行緒得到了 CPU,並開始執行 target 引數執行的目標函式或者 run() 方法,就表明當前執行緒處於執行狀態。
但如果當前有多個執行緒處於就緒狀態(等待 CPU 排程)時,處於執行狀態的執行緒將無法一直霸佔 CPU 資源,為了使其它執行緒也有執行的機會,CPU 會在一定時間內強制當前執行的執行緒讓出 CPU 資源,以供其他執行緒使用。
執行緒的阻塞狀態
當 CPU 對多個執行緒進行排程時,對於獲得 CPU 排程卻沒有執行完畢的執行緒,就會進入阻塞狀態。
目前幾乎所有的桌面和伺服器作業系統,都採用的是搶佔式優先順序排程策略。即 CPU 會給每一個就緒執行緒一段固定時間來處理任務,當該時間用完後,系統就會阻止該執行緒繼續使用 CPU 資源,讓其他執行緒獲得執行的機會。
對於具體選擇那個執行緒上 CPU,不同的平臺採用不同的演算法,比如先進先出演算法(FIFO)、時間片輪轉演算法、優先順序演算法等,每種演算法各有優缺點,適用於不同的場景。
除此之外,如果處於執行狀態的執行緒發生如下幾種情況,也將會由執行狀態轉到阻塞狀態:
- 執行緒呼叫了 sleep() 方法;
- 執行緒等待接收使用者輸入的資料;
- 執行緒試圖獲取某個物件的同步鎖時,如果該鎖被其他執行緒所持有,則當前執行緒進入阻塞狀態;
- 執行緒呼叫 wait() 方法,等待特定條件的滿足。
以上幾種情況都會導致執行緒阻塞,只有解決了執行緒遇到的問題之後,該執行緒才會由阻塞狀態轉到就緒狀態,繼續等待 CPU 排程。
以上 4 種可能發生執行緒阻塞的情況,解決措施分別如下:
- sleep() 方法規定的時間已過;
- 執行緒接收到了使用者輸入的資料;
- 其他執行緒釋放了該同步鎖,並由該執行緒獲得;
- 呼叫 set() 方法發出通知。
執行緒死亡狀態
對於獲得 CPU 排程卻未執行完畢的執行緒,它會轉入阻塞狀態,待條件成熟之後繼續轉入就緒狀態,重複爭取 CPU 資源,直到其執行結束。
執行結束的執行緒將處於死亡狀態。
執行緒執行結束,除了正常執行結束外,如果程式執行過程發生異常(Exception)或者錯誤(Error),執行緒也會進入死亡狀態。
對於處於死亡狀態的執行緒,有以下 2 點需要注意:
- 主執行緒死亡,並不意味著所有執行緒全部死亡。也就是說,主執行緒的死亡,不會影響子執行緒繼續執行;反之也是如此。
- 對於死亡的執行緒,無法再呼叫 start() 方法使其重新啟動,否則 Python 直譯器將丟擲 RuntimeError 異常。
以上就是python 執行緒的五個狀態的詳細內容,更多關於python 執行緒狀態的資料請關注我們其它相關文章!