Python線程專題8:使用鎖的注意事項

上一篇文章: Python線程專題7:條件變量
下一篇文章: Python線程專題9:線程終止與掛起

使用諸如Lock、RLock、Semphore之類的鎖原語時,必須多加當心,鎖的錯誤使用很容易致使死鎖或相互競爭。依賴鎖的代碼應該保證當出現異常時能夠正常的釋放鎖。編程

典型代碼以下:segmentfault

try:
    lock.acquire()
    #關鍵部分
    ...
finally:
    lock.release()

另外,全部種類的鎖還支持上下文管理協議(寫起來更簡潔):多線程

with語句自動獲取鎖,而且在控制流離開上下文時自動釋放鎖。ui

with lock:
    #關鍵部分
    ...

此外,編寫代碼時通常應該避免同時獲取多個鎖,例以下面就應該儘可能避免:線程

這通知很統一致使應用程序神祕死鎖,儘管與集中策略能夠避免出現這種狀況(如分層鎖定),可是最好在編寫代碼時避免這種嵌套鎖。code

with lock_A:
    #關鍵部分
    ...
    with lock_B:
        #B的關鍵部分
        ...

儘管在Python中能夠使用各類鎖和同步原語的組合編寫很是傳統的多線程程序,但有一種首推的編程方式要優於其餘全部編程方式:即將多線程程序組織爲多個獨立任務的集合,這些任務之間經過消息隊列進行通訊,例以下面要講的queue模塊。隊列

相關文章
相關標籤/搜索