久久国产乱子伦精品免费M,亚洲一区二区三区91,欧美国产在线视频,国产精品视频久久

Python新人入手線程技術(shù)教程,值得收藏

相信很多新手同學才開始學習Python的時候,對于線程技術(shù)很是困惑,今天就給大家?guī)砹薖ython新手入手線程技術(shù)的教程,希望可以幫到大家。

1.線程基礎(chǔ)1.1.線程狀態(tài)線程有5種狀態(tài),狀態(tài)轉(zhuǎn)換的過程如下圖所示:

Python新人入手線程技術(shù)教程,值得收藏

1.2. 線程同步(鎖) 多線程的優(yōu)勢在于可以同時運行多個任務(至少感覺起來是這樣)。但是當線程需要共享數(shù)據(jù)時,可能存在數(shù)據(jù)不同步的問題??紤]這樣一種情況:一個列表里所有元素都是0,線程"set"從后向前把所有元素改成1,而線程"print"負責從前往后讀取列表并打印。那么,可能線程"set"開始改的時候,線程"print"便來打印列表了,輸出就成了一半0一半1,這就是數(shù)據(jù)的不同步。為了避免這種情況,引入了鎖的概念。

鎖有兩種狀態(tài)——鎖定和未鎖定。每當一個線程比如"set"要訪問共享數(shù)據(jù)時,必須先獲得鎖定;如果已經(jīng)有別的線程比如"print"獲得鎖定了,那么就讓線程"set"暫停,也就是同步阻塞;等到線程"print"訪問完畢,釋放鎖以后,再讓線程"set"繼續(xù)。經(jīng)過這樣的處理,打印列表時要么全部輸出0,要么全部輸出1,不會再出現(xiàn)一半0一半1的尷尬場面。

線程與鎖的交互如下圖所示:

Python新人入手線程技術(shù)教程,值得收藏

1.3. 線程通信(條件變量) 然而還有另外一種尷尬的情況:列表并不是一開始就有的;而是通過線程"create"創(chuàng)建的。如果"set"或者"print" 在"create"還沒有運行的時候就訪問列表,將會出現(xiàn)一個異常。使用鎖可以解決這個問題,但是"set"和"print"將需要一個無限循環(huán)——他們不知道"create"什么時候會運行,讓"create"在運行后通知"set"和"print"顯然是一個更好的解決方案。于是,引入了條件變量。

條件變量允許線程比如"set"和"print"在條件不滿足的時候(列表為None時)等待,等到條件滿足的時候(列表已經(jīng)創(chuàng)建)發(fā)出一個通知,告訴"set" 和"print"條件已經(jīng)有了,你們該起床干活了;然后"set"和"print"才繼續(xù)運行。

線程與條件變量的交互如下圖所示:

Python新人入手線程技術(shù)教程,值得收藏

Python新人入手線程技術(shù)教程,值得收藏

1.4. 線程運行和阻塞的狀態(tài)轉(zhuǎn)換 最后看看線程運行和阻塞狀態(tài)的轉(zhuǎn)換。

Python新人入手線程技術(shù)教程,值得收藏

阻塞有三種情況:

同步阻塞是指處于競爭鎖定的狀態(tài),線程請求鎖定時將進入這個狀態(tài),一旦成功獲得鎖定又恢復到運行狀態(tài);

等待阻塞是指等待其他線程通知的狀態(tài),線程獲得條件鎖定后,調(diào)用“等待”將進入這個狀態(tài),一旦其他線程發(fā)出通知,線程將進入同步阻塞狀態(tài),再次競爭條件鎖定;

而其他阻塞是指調(diào)用time.sleep()、anotherthread.join()或等待IO時的阻塞,這個狀態(tài)下線程不會釋放已獲得的鎖定。

 

馬哥學習交流群

馬哥教育-Python開發(fā)-1群 335068227

馬哥教育-Python開發(fā)-2群 608459685

 

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評如潮的Linux云計算運維、SRE、Devops、網(wǎng)絡安全、云原生、Go、Python開發(fā)專業(yè)人才培訓機構(gòu)!

    1. 主站蜘蛛池模板: 晋城| 乌拉特中旗| 梓潼县| 砀山县| 郓城县| 贵德县| 宁明县| 胶州市| 双流县| 于田县| 吕梁市| 纳雍县| 沁水县| 淮北市| 龙江县| 宽城| 邢台县| 民和| 仲巴县| 枣强县| 漳浦县| 万山特区| 勐海县| 施秉县| 宣武区| 壤塘县| 乌苏市| 台安县| 伊川县| 威远县| 同仁县| 黑山县| 武功县| 宕昌县| 云林县| 绿春县| 宜黄县| 道孚县| 宣城市| 保亭| 北流市|