【Python】-thread RLock操作

'''
练习:线程锁
threading 模块提供了Lock和RLock两个类
1、threading.Lock:它是基本的锁对象,每次只能锁定一次,其余的锁请求,需要等待锁释放后才能获取。
2、threading.RLock:它代表可重入锁,同一个线程中可以多次锁定,也可以多次释放。该锁的acquire()和Release()方法必须成对出现
3、Lock和RLock都提供了两个方法实现加锁和释放锁
   a、acquire(blocking=True,timeout=-1),请求加锁,其中timeout制定加锁多少秒
   b、release():释放锁
'''
import threading
import time

class Account:
	def __init__(self,account_no,balance):
		#定义account构造函数
		#封装账户编号和账户余额两个成员变量
		self.account_no = account_no
		self._balance = balance
		self.lock = threading.RLock()
	
	def getBalance(self):
		#由于账户余额不允许随便修改,所以只为self._balance提供getter方法
		return self.balance
	
	def draw(self,draw_amount):
		#提供一个线程安全的draw()方法来完成取钱操作
		#加锁
		self.lock.acquire()
		try:
			if self._balance >= draw_amount:
				print(threading.current_thread().name+"取钱成功!吐出钞票:"+str(draw_amount))
				time.sleep(0.001)
				#修改余额
				self._balance -=draw_amount
				print("\t余额为:"+str(self._balance))
			else:
				print(threading.current_thread().name+"取钱失败,余额不足!")
		finally:
			self.lock.release()
		
def draw_money(account,draw_amount):
	#传递进来的account对象和需要取的钱数-draw_amount
	account.draw(draw_amount)

acct = Account("134567",1000)
#使用两个线程模拟取钱
threading.Thread(name='甲', target=draw_money, args=(acct, 800)).start()
threading.Thread(name='乙', target=draw_money, args=(acct, 800)).start()

'''执行结果如下
甲取钱成功!吐出钞票:800
        余额为:200
乙余额不足,取钱失败!
'''

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章