python基礎24 -----python中的各種鎖
一、全局解釋器鎖(GIL)
1、什麽是全局解釋器鎖
在同一個進程中只要有一個線程獲取了全局解釋器(cpu)的使用權限,那麽其他的線程就必須等待該線程的全局解釋器(cpu)使 用權消失後才能使用全局解釋器(cpu),即時多個線程直接不會相互影響在同一個進程下也只有一個線程使用cpu,這樣的機制稱為全局 解釋器鎖(GIL)。
2、全局解釋器鎖的好處
1、避免了大量的加鎖解鎖的好處
2、使數據更加安全,解決多線程間的數據完整性和狀態同步
3、全局解釋器的缺點
多核處理器退化成單核處理器,只能並發不能並行。
4、如圖所示:
同一時刻的某個進程下的某個線程只能被一個cpu所處理,所以在GIL鎖下的線程只能被並發,不能被並行。
5、實例:
二、同步鎖
1、什麽是同步鎖?
同一時刻的一個進程下的一個線程只能使用一個cpu,要確保這個線程下的程序在一段時間內被cpu執,那麽就要用到同步鎖。
2、為什麽用同步鎖?
因為有可能當一個線程在使用cpu時,該線程下的程序可能會遇到io操作,那麽cpu就會切到別的線程上去,這樣就有可能會影響到該程 序結果的完整性。
3、怎麽使用同步鎖?
只需要在對公共數據的操作前後加上上鎖和釋放鎖的操作即可。
4、實例:
· 5、擴展知識
1、GIL的作用:多線程情況下必須存在資源的競爭,GIL是為了保證在解釋器級別的線程唯一使用共享資源(cpu)。
2、同步鎖的作用:為了保證解釋器級別下的自己編寫的程序唯一使用共享資源產生了同步鎖。
三、遞歸鎖和死鎖
1、什麽是死鎖?
指兩個或兩個以上的線程或進程在執行程序的過程中,因爭奪資源而相互等待的一個現象,如圖所示。
2、什麽是遞歸鎖?
在Python中為了支持同一個線程中多次請求同一資源,Python提供了可重入鎖。這個RLock內部維護著一個Lock和一個counter
變量,counter記錄了acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲
得資源。
四、信號量(semaphore)
1、什麽是信號量?
同進程的一樣,semaphore管理一個內置的計數器,每當調用acquire()時內置函數-1,每當調用release()時內置函數+1。
計數器不能為0,當計數器為0時acquire()將阻塞線程,直到其他線程調用release()。
2、如圖所示:
python基礎24 -----python中的各種鎖