銀行轉賬:兩個賬戶同時給對方轉賬,模擬線程死鎖
from threading import thread,lock
from time import sleep
#賬戶類
class
account
:def
__init__
(self,_id,balance,lock)
:#每個賬戶自帶乙個鎖,只要數字balance要變動,就要提前上鎖
self.
id= _id
self.balance = balance
self.lock = lock
#取錢defwithdraw
(self,amount)
: self.balance -= amount
#存錢defdeposit
(self,amount)
: self.balance += amount
#檢視餘額
defget_balance
(self)
:return self.balance
#生成兩個賬戶
tom = account(
'tom'
,12000
,lock())
#lock()直接建立了乙個鎖
abby = account(
'abby'
,9000
,lock())
#轉賬函式,轉賬基本原則:誰的賬戶要動,需要先上鎖
#from_引數為要轉出賬戶,to引數為轉入賬戶
deftransfer
(from_,to,amount)
:#from_賬戶上鎖
if from_.lcok.acquire():
from_.withdraw(amount)
#from_賬戶減少
#to賬戶要動了,也要上鎖
if to.lock.acquire():
to.deposit(amount)
#to 加錢
to.lock.release(
)#加錢完畢,解鎖
#from_賬戶也轉賬完畢,解鎖
from_.lock.release(
)print
('%s給%s轉了%d元'
%(from_._id,to._id,amount)
#生成兩個執行緒,同時轉賬
t1 = thread(target=transfer,args=
(tom,abby,
4000))
#tom給abby轉4000
t2 = thread(target=transfer,args=
(abby,tom,
1500))
#abby給tom轉2500
#流程:兩個執行緒同時執行,執行緒t1給tom上鎖,執行緒t2給abby上鎖,兩個執行緒都向下走,準備給對方上鎖,發現對方已經鎖上了,資源互不釋放,造成死鎖
t1.start(
)t2.start(
)t1.join(
)t2.join(
)print
('tom:'
,tom.get_balance())
print
('abby:'
,abby.get_balance(
))
Python 多執行緒死鎖的示例
在 python 中多執行緒中為了防止資源競爭而出現問題,提供了鎖的機制,當乙個執行緒操作資源時進行加鎖,操作完畢後釋放鎖,這樣其他執行緒就不會同時操作資源匯出出現異常。在 python 多執行緒中注意是兩種鎖 互斥鎖和遞迴鎖 那麼它們有什麼區別呢?互斥鎖 一旦乙個執行緒獲得乙個互斥鎖,會阻塞隨後嘗...
python 死鎖 死鎖的示例 with
死鎖 死鎖就是一直等待對方釋放鎖的情景 死鎖的結果會造成程式的停止響應,不能再處理其他的任務了 需求 根據下標在列表中取值,保證同一時刻只能有乙個執行緒去取值 import threading import time 建立互斥鎖 lock threading.lock 根據下標去取值,保證同一時刻只...
python死鎖案例 Python執行緒 死鎖
死鎖產生的4個必要條件 1 互斥 乙個資源同一時刻只允許乙個執行緒進行訪問。2 占有未釋放 乙個執行緒占有資源,且沒有釋放資源。3 不可搶占 乙個已經占有資源的執行緒無法搶占到其他執行緒擁有的資源。4 迴圈等待 兩個或者兩個以上的執行緒,本身擁有資源,不釋放資源,並且同時嘗試獲得其他執行緒所持有的資...