Python執行緒技術基礎

2022-07-17 07:00:18 字數 1476 閱讀 2808

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時的阻塞,這個狀態下執行緒不會釋放已獲得的鎖定。

多執行緒技術基礎

程序與執行緒 舉個例子,電腦上執行的各個應用程式為程序,那麼在乙個應用程式中的執行的為執行緒。執行的程式為程序,乙個進可以產生多個執行緒。多執行緒 同時多條執行緒同時執行,就好像你個人可以邊吃飯邊聽歌一樣。兩種方法 用extends繼承thread類 用implements實現runnable介面 ...

python基礎 執行緒

呼叫 thread 模組中的start new thread 函式來產生新執行緒。語法如下 import threading import time def someting for i in range 1,11 print i time.sleep 1 threading.start new t...

Python基礎 多執行緒

多執行緒在程式開發過程中特別重要,我們往往把一些耗時的操作在子執行緒中執行,這就是所謂的多執行緒了。在c 11中,寫了一些關於多執行緒的部落格。python也不例外,當然也要有多執行緒了。python提供了兩個模組來實現多執行緒thread 和threading thread 有一些缺點,在thre...