国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

python 線程的五個狀態(tài)

瀏覽:3日期:2022-07-10 14:00:02

當(dāng)程序中包含多個線程時,CPU 不是一直被特定的線程霸占,而是輪流執(zhí)行各個線程。

那么,CPU 在輪換執(zhí)行線程的過程中,即從創(chuàng)建到消亡的整個過程,可能會歷經(jīng) 5 種狀態(tài),分別是新建、就緒、運(yùn)行、阻塞和死亡。

python 線程的五個狀態(tài)

線程的新建狀態(tài)

無論是通過 Thread 類直接實(shí)例化對象創(chuàng)建線程,還是通過繼承自 Thread 類的子類實(shí)例化創(chuàng)建線程,新創(chuàng)建的線程在調(diào)用 start() 方法之前,不會得到執(zhí)行,此階段的線程就處于新建狀態(tài)。

線程的就緒狀態(tài)

當(dāng)位于新建狀態(tài)的線程調(diào)用 start() 方法后,該線程就轉(zhuǎn)換到就緒狀態(tài)。

所謂就緒,就是告訴 CPU,該線程已經(jīng)可以執(zhí)行了,但是具體什么時候執(zhí)行,取決于 CPU 什么時候調(diào)度它。

換句話說,如果一個線程處于就緒狀態(tài),只能說明此線程已經(jīng)做好了準(zhǔn)備,隨時等待 CPU 調(diào)度執(zhí)行,并不是說執(zhí)行了 start() 方法此線程就會立即被執(zhí)行。

線程的運(yùn)行狀態(tài)

當(dāng)位于就緒狀態(tài)的線程得到了 CPU,并開始執(zhí)行 target 參數(shù)執(zhí)行的目標(biāo)函數(shù)或者 run() 方法,就表明當(dāng)前線程處于運(yùn)行狀態(tài)。

但如果當(dāng)前有多個線程處于就緒狀態(tài)(等待 CPU 調(diào)度)時,處于運(yùn)行狀態(tài)的線程將無法一直霸占 CPU 資源,為了使其它線程也有執(zhí)行的機(jī)會,CPU 會在一定時間內(nèi)強(qiáng)制當(dāng)前運(yùn)行的線程讓出 CPU 資源,以供其他線程使用。

線程的阻塞狀態(tài)

當(dāng) CPU 對多個線程進(jìn)行調(diào)度時,對于獲得 CPU 調(diào)度卻沒有執(zhí)行完畢的線程,就會進(jìn)入阻塞狀態(tài)。

目前幾乎所有的桌面和服務(wù)器操作系統(tǒng),都采用的是搶占式優(yōu)先級調(diào)度策略。即 CPU 會給每一個就緒線程一段固定時間來處理任務(wù),當(dāng)該時間用完后,系統(tǒng)就會阻止該線程繼續(xù)使用 CPU 資源,讓其他線程獲得執(zhí)行的機(jī)會。

對于具體選擇那個線程上 CPU,不同的平臺采用不同的算法,比如先進(jìn)先出算法(FIFO)、時間片輪轉(zhuǎn)算法、優(yōu)先級算法等,每種算法各有優(yōu)缺點(diǎn),適用于不同的場景。

除此之外,如果處于運(yùn)行狀態(tài)的線程發(fā)生如下幾種情況,也將會由運(yùn)行狀態(tài)轉(zhuǎn)到阻塞狀態(tài):

線程調(diào)用了 sleep() 方法; 線程等待接收用戶輸入的數(shù)據(jù); 線程試圖獲取某個對象的同步鎖時,如果該鎖被其他線程所持有,則當(dāng)前線程進(jìn)入阻塞狀態(tài); 線程調(diào)用 wait() 方法,等待特定條件的滿足。

以上幾種情況都會導(dǎo)致線程阻塞,只有解決了線程遇到的問題之后,該線程才會由阻塞狀態(tài)轉(zhuǎn)到就緒狀態(tài),繼續(xù)等待 CPU 調(diào)度。

以上 4 種可能發(fā)生線程阻塞的情況,解決措施分別如下:

sleep() 方法規(guī)定的時間已過; 線程接收到了用戶輸入的數(shù)據(jù); 其他線程釋放了該同步鎖,并由該線程獲得; 調(diào)用 set() 方法發(fā)出通知。

線程死亡狀態(tài)

對于獲得 CPU 調(diào)度卻未執(zhí)行完畢的線程,它會轉(zhuǎn)入阻塞狀態(tài),待條件成熟之后繼續(xù)轉(zhuǎn)入就緒狀態(tài),重復(fù)爭取 CPU 資源,直到其執(zhí)行結(jié)束。

執(zhí)行結(jié)束的線程將處于死亡狀態(tài)。

線程執(zhí)行結(jié)束,除了正常執(zhí)行結(jié)束外,如果程序執(zhí)行過程發(fā)生異常(Exception)或者錯誤(Error),線程也會進(jìn)入死亡狀態(tài)。

對于處于死亡狀態(tài)的線程,有以下 2 點(diǎn)需要注意:

主線程死亡,并不意味著所有線程全部死亡。也就是說,主線程的死亡,不會影響子線程繼續(xù)執(zhí)行;反之也是如此。 對于死亡的線程,無法再調(diào)用 start() 方法使其重新啟動,否則 Python 解釋器將拋出 RuntimeError 異常。

以上就是python 線程的五個狀態(tài)的詳細(xì)內(nèi)容,更多關(guān)于python 線程狀態(tài)的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 甘肃省| 自贡市| 赣榆县| 浮梁县| 麻城市| 兴国县| 集贤县| 津南区| 吉木乃县| 高邑县| 沛县| 巴彦淖尔市| 阿拉善盟| 福建省| 开鲁县| 右玉县| 手机| 莎车县| 长沙市| 磐石市| 民权县| 米脂县| 双鸭山市| 舟曲县| 关岭| 娱乐| 工布江达县| 龙游县| 莒南县| 武陟县| 洪江市| 胶州市| 蛟河市| 泸溪县| 邳州市| 自治县| 灵台县| 松滋市| 安多县| 张家川| 中超|