每個線程互相獨立,互相之間沒有任何關系,但是在同一個程序中的資源,線程是共享的,如果不進行資源的合理配置設定,對資料造成破壞,使得線程運作的結果不可預期。這種現象稱為“線程不安全”。
線程同步能夠保證多個線程安全通路競争資源,最簡單的同步機制是引入互斥鎖。互斥鎖為資源引入一個狀态:鎖定/非鎖定。某個線程要更改共享資料時,先将其鎖定,此時資源的狀态為“鎖定”,其他線程不能更改;直到該線程釋放資源,将資源的狀态變成“非鎖定”,其他的線程才能再次鎖定該資源。互斥鎖保證了每次隻有一個線程進行寫入操作,進而保證了多線程情況下資料的正确性。
threading子產品中定義了Lock類,可以友善的處理鎖定:
其中,鎖定方法acquire可以有一個逾時時間的可選參數timeout。如果設定了timeout,則在逾時後通過傳回值可以判斷是否得到了鎖,進而可以進行一些其他的處理。
在threading子產品中,定義兩種類型的瑣:threading.Lock和threading.RLock。它們之間有一點細微的差別,通過比較下面兩段代碼來說明:
import threading
lock = threading.Lock() #Lock對象
lock.acquire()
lock.acquire() #産生了死瑣。
lock.release()
rLock = threading.RLock() #RLock對象
rLock.acquire()
rLock.acquire() #在同一線程内,程式不會堵塞。
rLock.release()