互斥鎖
# 鎖通常被用來實現對共享資源的同步訪問。為每一個共享資源創建一個Lock對象,
l = Lock()#創建一個鎖,初始狀態是未鎖定
# 當你需要訪問該資源時,調用l.acquire方法來獲取鎖對象
# (如果其它線程已經獲得了該鎖,則當前線程需等待其被釋放)
# ,待資源訪問完后,再調用l.release方法釋放鎖

from threading import Thread,Lock,RLock import time def gg(A,B): A.acquire() time.sleep(0.5) print('hah拿到鎖') B.acquire() print('hah拿到鎖') A.release() B.release() def gg2(A,B): B.acquire() print('hah1拿到鎖') A.acquire() print('hah1拿到鎖') A.release() B.release() if __name__ == '__main__': # A = Lock() # B = Lock() # 解決死鎖 A = B = RLock() #每個遞歸鎖都有自己的遞歸鎖的計數器, t1 = Thread(target=gg,args=(A,B)) t2 = Thread(target=gg2,args=(A,B)) t1.start() t2.start() 同一個遞歸鎖,每碰到一個acquire 計數器加1 每碰道一個release計算器減1
gil 鎖 # 在Cpython中,gil鎖相當於鎖定python解釋器的鎖,在同一個進程下可以開啟多個線程,但是同一時刻只能有一個線程執行,無法利用多核技術 #優勢 # 1. GIL本質就是一把互斥鎖,所有互斥鎖的本質都一樣,都是將並發運行變成串行,以此來控制同一時間內共享數據只能被一個任務所修改, # 進而保證數據安全 # 2.每運行一個Py文件文件都會對應產生一個獨立的進程,在該進程內不僅有這個程序的主線程還開啟了其他的線程 # 還有解釋器開啟的垃圾回收等解釋器級別的線程 # GIL保護的是解釋器級的數據,保護用戶自己的數據則需要自己加鎖處理 # 進程可以利用多核,但是開銷大,而python的多線程開銷小,但卻無法利用多核優勢
python解釋器運行原理

