Python線程指南)

來源:互聯網
上載者:User
1. 線程基礎1.1. 線程狀態

線程有5種狀態,狀態轉換的過程如所示:

1.2. 線程同步(鎖)

多線程的優勢在於可以同時運行多個任務(至少感覺起來是這樣)。但是當線程需要共用資料時,可能存在資料不同步的問題。考慮這樣一種情況:一個列表裡所有元素都是0,線程"set"從後向前把所有元素改成1,而線程"print"負責從前往後讀取列表並列印。那麼,可能線程"set"開始改的時候,線程"print"便來列印列表了,輸出就成了一半0一半1,這就是資料的不同步。為了避免這種情況,引入了鎖的概念。

鎖有兩種狀態——鎖定和未鎖定。每當一個線程比如"set"要訪問共用資料時,必須先獲得鎖定;如果已經有別的線程比如"print"獲得鎖定了,那麼就讓線程"set"暫停,也就是同步阻塞;等到線程"print"訪問完畢,釋放鎖以後,再讓線程"set"繼續。經過這樣的處理,列印列表時要麼全部輸出0,要麼全部輸出1,不會再出現一半0一半1的尷尬場面。

線程與鎖的互動如所示:

1.3. 線程通訊(條件變數)

然而還有另外一種尷尬的情況:列表並不是一開始就有的;而是通過線程"create"建立的。如果"set"或者"print" 在"create"還沒有啟動並執行時候就訪問列表,將會出現一個異常。使用鎖可以解決這個問題,但是"set"和"print"將需要一個無限迴圈——他們不知道"create"什麼時候會運行,讓"create"在運行後通知"set"和"print"顯然是一個更好的解決方案。於是,引入了條件變數。

條件變數允許線程比如"set"和"print"在條件不滿足的時候(列表為None時)等待,等到條件滿足的時候(列表已經建立)發出一個通知,告訴"set" 和"print"條件已經有了,你們該起床幹活了;然後"set"和"print"才繼續運行。

線程與條件變數的互動如所示:

  

1.4. 線程運行和阻塞的狀態轉換

最後看看線程運行和阻塞狀態的轉換。

阻塞有三種情況: 
同步阻塞是指處於競爭鎖定的狀態,線程請求鎖定時將進入這個狀態,一旦成功獲得鎖定又恢複到運行狀態; 
等待阻塞是指等待其他線程通知的狀態,線程獲得條件鎖定後,調用“等待”將進入這個狀態,一旦其他線程發出通知,線程將進入同步阻塞狀態,再次競爭條件鎖定; 
而其他阻塞是指調用time.sleep()、anotherthread.join()或等待IO時的阻塞,這個狀態下線程不會釋放已獲得的鎖定。

tips: 如果能理解這些內容,接下來的主題將是非常輕鬆的;並且,這些內容在大部分流行的程式設計語言裡都是一樣的。(意思就是非看懂不可 >_< 嫌作者水平低找別人的教程也要看懂)

2. thread

Python通過兩個標準庫thread和threading提供對線程的支援。thread提供了低層級的、原始的線程以及一個簡單的鎖。

?
1234567891011121314151617181920212223242526272829303132333435363738
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.