新聞中心
如果您嘗試運行下面提供的代碼,鎖對象將在第一次調(diào)用acquire()方法時獲得鎖,但第二次不會。

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),玉溪企業(yè)網(wǎng)站建設(shè),玉溪品牌網(wǎng)站建設(shè),網(wǎng)站定制,玉溪網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,玉溪網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
為什么會這樣?因為正常的鎖對象一旦被獲取就不能被重新獲取,即使相同的線程試圖這樣做。
但是為什么會有人嘗試兩次調(diào)用acquire()方法呢?讓我們舉一個簡單的例子來演示這個簡單的鎖定問題:
lock = threading.Lock()
def get_first_line():
lock.acquire()
try:
# read some file and get the first line
finally:
lock.release()
return data
def get_second_line():
lock.acquire()
try:
# read the same file and get the second line
finally:
lock.release()
return data在上面的代碼中,我們有兩個不同的函數(shù)從共享資源中讀取不同部分的數(shù)據(jù)。我們使用了鎖定機制來防止任何其他線程在我們的線程讀取文件時修改文件的數(shù)據(jù)。
現(xiàn)在考慮您想要逐個調(diào)用這兩個函數(shù),您將這樣做:
first = get_first_line()
second = get_second_line()
return first, second 但是這個調(diào)用仍然不是線程安全的,因為當(dāng)您從共享資源中讀取數(shù)據(jù)時,在兩個函數(shù)調(diào)用之間可以有任何其他線程可以修改共享資源的內(nèi)容。
為了避免這種情況,我們可以獲取一個鎖,然后調(diào)用這兩個函數(shù):
lock.acquire()
try:
first = get_first_line()
second = get_second_line()
finally:
lock.release()
return first, second 但是,這段代碼不會起作用,因為我們將在同一線程內(nèi)的鎖對象上調(diào)用acquire(),試圖在調(diào)用函數(shù)之前已經(jīng)獲取的函數(shù)內(nèi)再次獲取鎖。
因此,在這種情況下,不能使用基本的鎖對象。對于這樣的情況我們有RLock類。
對象:Python 多線程
RLock 代表可重入鎖。同一個線程可以多次獲取可重入鎖。
RLock 對象也有兩個可以調(diào)用的方法,它們是:
acquire()方法release()方法
這里有一個簡單的例子來演示RLock對象的工作:
如果我們使用RLock對象,那么簡單的鎖定問題示例中的代碼也將毫無問題地工作:
lock = threading.RLock()
lock.acquire()
try:
first = get_first_line()
second = get_second_line()
finally:
lock.release()
return first, second 上面的代碼可以正常工作。
新聞名稱:Python中的鎖對象——可重入鎖
轉(zhuǎn)載來于:http://fisionsoft.com.cn/article/cdohjsd.html


咨詢
建站咨詢
