Python的鎖


互斥鎖
# 鎖通常被用來實現對共享資源的同步訪問。為每一個共享資源創建一個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解釋器運行原理




 

 

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM