程序的原子性,python實現原子性,上鎖解鎖threading.Lock()
阿新 • • 發佈:2018-08-17
執行 結束 錯誤 多個 加鎖 lease mut 同時 帳戶
A想要從自己的帳戶中轉1000塊錢到B的帳戶裏。那個從A開始轉帳,到轉帳結束的這一個過程,稱之為一個事務。在這個事務裏,要做如下操作:
1. 從A的帳戶中減去1000塊錢。如果A的帳戶原來有3000塊錢,現在就變成2000塊錢了。
2. 在B的帳戶裏加1000塊錢。如果B的帳戶如果原來有2000塊錢,現在則變成3000塊錢了。
如果在A的帳戶已經減去了1000塊錢的時候,忽然發生了意外,比如停電什麽的,導致轉帳事務意外終止了,而此時B的帳戶裏還沒有增加1000塊錢。那麽,我們稱這個操作失敗了,要進行回滾。回滾就是回到事務開始之前的狀態,也就是回到A的帳戶還沒減1000塊的狀態,B的帳戶的原來的狀態。此時A的帳戶仍然有3000塊,B的帳戶仍然有2000塊。
我們把這種要麽一起成功(A帳戶成功減少1000,同時B帳戶成功增加1000),要麽一起失敗(A帳戶回到原來狀態,B帳戶也回到原來狀態)的操作叫原子性操作。
如果把一個事務可看作是一個程序,它要麽完整的被執行,要麽完全不執行。這種特性就叫原子性
python中使用[互斥鎖Mutex]防止多個線程同時對一個變量修改導致的錯誤.
mutex = threading.Lock() 創建一把鎖,默認沒上鎖
mutex.acquire()上鎖
mutex.release()解鎖
如果一個線程執行到mutex.acquire(),如果發現鎖已經被鎖上則停止執行一直等到其他線程執行解鎖操作mutex.release()
加鎖的原則是代碼行盡可能的少
程序的原子性,python實現原子性,上鎖解鎖threading.Lock()