1. 程式人生 > >程序的原子性,python實現原子性,上鎖解鎖threading.Lock()

程序的原子性,python實現原子性,上鎖解鎖threading.Lock()

執行 結束 錯誤 多個 加鎖 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()