【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
乙餘額不足,取錢失敗!
'''

 

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