python 线程死锁示例

最后都变了- 提交于 2019-12-15 09:15:45

银行转账:两个账户同时给对方转账,模拟线程死锁

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

	#取钱
	def withdraw(self,amount):
		self.balance -= amount

	#存钱
	def deposit(self,amount):
		self.balance += amount

	#查看余额
	def get_balance(self):
		return self.balance

#生成两个账户
Tom = Account('Tom',12000,Lock())	#Lock()直接创建了一个锁
Abby = Account('Abby',9000,Lock())

#转账函数,转账基本原则:谁的账户要动,需要先上锁
#from_参数为要转出账户,to参数为转入账户
def transfer(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())
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!