国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python線程指南詳細(xì)介紹

2020-02-23 04:14:48
字體:
供稿:網(wǎng)友

本文介紹了Python對(duì)于線程的支持,包括“學(xué)會(huì)”多線程編程需要掌握的基礎(chǔ)以及Python兩個(gè)線程標(biāo)準(zhǔn)庫的完整介紹及使用示例。

注意:本文基于Python2.4完成,;如果看到不明白的詞匯請(qǐng)記得百度谷歌或維基,whatever。

1. 線程基礎(chǔ)

1.1. 線程狀態(tài)

線程有5種狀態(tài),狀態(tài)轉(zhuǎn)換的過程如下圖所示:

thread_stat_simple 

1.2. 線程同步(鎖)

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

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

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

thread_lock 

1.3. 線程通信(條件變量)

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

條件變量允許線程比如"set"和"print"在條件不滿足的時(shí)候(列表為None時(shí))等待,等到條件滿足的時(shí)候(列表已經(jīng)創(chuàng)建)發(fā)出一個(gè)通知,告訴"set" 和"print"條件已經(jīng)有了,你們?cè)撈鸫哺苫盍耍蝗缓?set"和"print"才繼續(xù)運(yùn)行。

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

thread_condition_wait  

thread_condition_notify

1.4. 線程運(yùn)行和阻塞的狀態(tài)轉(zhuǎn)換

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 岳普湖县| 浏阳市| 绍兴市| 台湾省| 盘锦市| 天镇县| 信阳市| 毕节市| 阆中市| 东源县| 宣威市| 报价| 札达县| 裕民县| 胶州市| 青铜峡市| 临沧市| 延安市| 黎川县| 甘孜县| 碌曲县| 铁岭市| 宜春市| 集安市| 淮滨县| 河源市| 哈巴河县| 衡阳市| 大丰市| 威信县| 红河县| 陇南市| 扎鲁特旗| 汝城县| 酉阳| 马山县| 门头沟区| 胶州市| 鸡西市| 乌拉特前旗| 楚雄市|