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

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


咨詢
建站咨詢
