上一篇文章: 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模塊。隊列