主線程 5個狀態,Python 中線程的生命週期

2021-10-14 18:58:26 字數 1492 閱讀 3163

編 程 的 朝 聖 之 路

當程式中包含多個執行緒時,cpu 不是一直被特定的執行緒霸佔,而是輪流執行各個執行緒。

那麼,cpu 在輪換執行執行緒的過程中,即從建立到消亡的整個過程,可能會歷經 5 種狀態,分別是新建、就緒、執行、阻塞和死亡。

無論是通過 thread 類直接例項化物件建立執行緒,還是通過繼承自 thread 類的子類例項化建立執行緒,新建立的執行緒在呼叫 start() 方法之前,不會得到執行,此階段的執行緒就處於新建狀態。

當位於新建狀態的執行緒呼叫 start() 方法後,該執行緒就轉換到就緒狀態。

所謂就緒,就是告訴 cpu,該執行緒已經可以執行了,但是具體什麼時候執行,取決於 cpu 什麼時候排程它。

換句話說,如果乙個執行緒處於就緒狀態,只能說明此執行緒已經做好了準備,隨時等待 cpu 排程執行,並不是說執行了 start() 方法此執行緒就會立即被執行。

當位於就緒狀態的執行緒得到了 cpu,並開始執行 target 引數執行的目標函式或者 run() 方法,就表明當前執行緒處於執行狀態。

但如果當前有多個執行緒處於就緒狀態(等待 cpu 排程)時,處於執行狀態的執行緒將無法一直霸佔 cpu 資源,為了使其它執行緒也有執行的機會,cpu 會在一定時間內強制當前執行的執行緒讓出 cpu 資源,以供其他執行緒使用。

當 cpu 對多個執行緒進行排程時,對於獲得 cpu 排程卻沒有執行完畢的執行緒,就會進入阻塞狀態。

目前幾乎所有的桌面和伺服器作業系統,都採用的是搶占式優先順序排程策略。即 cpu 會給每乙個就緒執行緒一段固定時間來處理任務,當該時間用完後,系統就會阻止該執行緒繼續使用 cpu 資源,讓其他執行緒獲得執行的機會。

對於具體選擇那個執行緒上 cpu,不同的平台採用不同的演算法,比如先進先出演算法(fifo)、時間片輪轉演算法、優先順序演算法等,每種演算法各有優缺點,適用於不同的場景。

除此之外,如果處於執行狀態的執行緒發生如下幾種情況,也將會由執行狀態轉到阻塞狀態:

以上幾種情況都會導致執行緒阻塞,只有解決了執行緒遇到的問題之後,該執行緒才會由阻塞狀態轉到就緒狀態,繼續等待 cpu 排程。

以上 4 種可能發生執行緒阻塞的情況,解決措施分別如下:

對於獲得 cpu 排程卻未執行完畢的執行緒,它會轉入阻塞狀態,待條件成熟之後繼續轉入就緒狀態,重複爭取 cpu 資源,直到其執行結束。

執行結束的執行緒將處於死亡狀態。

執行緒執行結束,除了正常執行結束外,如果程式執行過程發生異常(exception)或者錯誤(error),執行緒也會進入死亡狀態。

對於處於死亡狀態的執行緒,有以下 2 點需要注意:

python高階用法_ios-創客學院​www.makeru.com.cn

python中線程

程序和執行緒的區別 1.程序 每個程式都會有乙個程序,負責管理程式各個功能的執行,程序只會有乙個 而且至少有乙個 相當於包工頭 2.執行緒 每個程序裡面至少有乙個執行緒,稱之為主線程,除此以外還會有其他執行緒,稱之為分執行緒 執行緒是控制任務執行的最小單位 相當於農名工 3.程序負責控制各個執行緒的...

python 中線程

import threading import time class test threading.thread 繼承threading.thread def init self super test,self init def run self 設定執行緒方法 threadname threadi...

python中線程程式設計

一 執行緒 執行緒也是實現多工的一種方式,乙個程序中,也經常需要同時做多件事,就需要同時執行多個 子任務 這些子任務就是執行緒。乙個程序可以擁有多個並行的執行緒,其中每乙個執行緒,共享當前程序的資源。在python程式中,可以通過 thread 和threading 推薦使用 這兩個模組來處理執行緒...