多個執行執行緒經常要共享資料,如果僅僅讀取共享資料還好,但是如果多個執行緒要修改共享資料的話就可能出現無法預料的結果。
同步「鎖」機制
鎖物件用threading.rlock類建立
mylock = threading.rlock()如何使用鎖來同步執行緒呢?執行緒可以使用鎖的acquire()(獲得)方法,這樣鎖就進入「locked」狀態。每次只有乙個執行緒可以獲得鎖。如果當另乙個執行緒試圖獲得這個鎖的時候,就會被系統變為「blocked」狀態,直到那個擁有鎖的執行緒呼叫鎖的release()(釋放)方法,這樣鎖就會進入「unlocked」狀態。
「blocked」狀態的執行緒就會收到乙個通知,並有權利獲得鎖。如果多個執行緒處於「blocked」狀態,所有執行緒都會先解除「blocked」狀態,然後系統選擇乙個執行緒來獲得鎖,其他的執行緒繼續沉默(「blocked」)。
import threadingmylock = threading.rlock()
class mythread(threading.thread)
...def run(self ...):
... #
此處 不可以 放置修改共享資料的**
mylock.acquire()
... #
此處 可以 放置修改共享資料的**
mylock.release()
... #
此處 不可以 放置修改共享資料的**
我們把修改共享資料的**稱為「臨界區」,必須將所有「臨界區」都封閉在同一鎖物件的acquire()和release()方法呼叫之間。
使用條件變數
鎖只能提供最基本的同步級別。有時需要更複雜的執行緒同步,例如只在發生某些事件時才訪問乙個臨界區(例如當某個數值改變時)。這就要使用「條件變數」。 條件變數用threading.condition類建立
mycondition = threading.condition()
條件變數是如何工作的呢?首先乙個執行緒成功獲得乙個條件變數後,呼叫此條件變數的wait()方法會導致這個執行緒釋放這個鎖,並進入「blocked」狀態,直到另乙個執行緒呼叫同乙個條件變數的notify()方法來喚醒那個進入「blocked」狀態的執行緒。如果呼叫這個條件變數的notifyall()方法的話就會喚醒所有的在等待的執行緒。
如果程式或者執行緒永遠處於「blocked」狀態的話,就會發生死鎖。所以如果使用了鎖、條件變數等同步機制的話,一定要注意仔細檢查,防止死鎖情況的發生。對於可能產生異常的臨界區要使用異常處理機制中的finally子句來保證釋放鎖。等待乙個條件變數的執行緒必須用notify()方法顯式的喚醒,否則就永遠沉默。保證每乙個wait()方法呼叫都有乙個相對應的notify()呼叫,當然也可以呼叫notifyall()方法以防萬一。
Python多執行緒同步學習
多個執行執行緒經常要共享資料,如果僅僅讀取共享資料還好,但是如果多個執行緒要修改共享資料的話就可能出現無法預料的結果。同步 鎖 機制 鎖物件用threading.rlock類建立 mylock threading.rlock 如何使用鎖來同步執行緒呢?執行緒可以使用鎖的acquire 獲得 方法,這...
Python多執行緒同步
1 實現檔案讀寫的檔案ltz schedule times.py usr bin env python coding utf 8 import os def readtimes res if os.path.exists schedule times.txt fp open schedule tim...
python 多執行緒5執行緒同步
互斥鎖是最簡單的執行緒同步機制,python提供的condition物件提供了對複雜執行緒同步問題的支援。condition被稱為條件變數,除了提供與lock類似的acquire和release方法外,還提供了wait和notify方法。執行緒首先acquire乙個條件變數,然後判斷一些條件。如果條...