Python多線程編程(六):可重入鎖RLock
考慮這種情況:如果一個(gè)線程遇到鎖嵌套的情況該怎么辦,這個(gè)嵌套是指當(dāng)我一個(gè)線程在獲取臨界資源時(shí),又需要再次獲取。
根據(jù)這種情況,代碼如下:
'''
Created on 2012-9-8
@author: walfred
@module: thread.ThreadTest6
'''
import threading
import time
counter = 0
mutex = threading.Lock()
class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
global counter, mutex
time.sleep(1);
if mutex.acquire():
counter += 1
print "I am %s, set counter:%s" % (self.name, counter)
if mutex.acquire():
counter += 1
print "I am %s, set counter:%s" % (self.name, counter)
mutex.release()
mutex.release()
if __name__ == "__main__":
for i in range(0, 200):
my_thread = MyThread()
my_thread.start()
這種情況的代碼運(yùn)行情況如下:
I am Thread-1, set counter:1
之后就直接掛起了,這種情況形成了最簡單的死鎖。
那有沒有一種情況可以在某一個(gè)線程使用互斥鎖訪問某一個(gè)競爭資源時(shí),可以再次獲取呢?在Python中為了支持在同一線程中多次請求同一資源,python提供了“可重入鎖”:threading.RLock。這個(gè)RLock內(nèi)部維護(hù)著一個(gè)Lock和一個(gè)counter變量,counter記錄了acquire的次數(shù),從而使得資源可以被多次require。直到一個(gè)線程所有的acquire都被release,其他的線程才能獲得資源。上面的例子如果使用RLock代替Lock,則不會(huì)發(fā)生死鎖:
代碼只需將上述的:
mutex = threading.Lock()
替換成:
mutex = threading.RLock()
即可。
相關(guān)文章
PyQt5+Caffe+Opencv搭建人臉識(shí)別登錄界面
這篇文章主要為大家詳細(xì)介紹了PyQt5+Caffe+Opencv搭建人臉識(shí)別登錄界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Python 實(shí)現(xiàn)輸入任意多個(gè)數(shù),并計(jì)算其平均值的例子
今天小編就為大家分享一篇Python 實(shí)現(xiàn)輸入任意多個(gè)數(shù),并計(jì)算其平均值的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07詳解python中的defaultdict?默認(rèn)值
這篇文章主要介紹了defaultdict?默認(rèn)值,defaultdict是python內(nèi)建dict類的一個(gè)字類,功能與dict相同,但它帶有一個(gè)默認(rèn)的值,若key值不存在時(shí)返回一個(gè)默認(rèn)的值,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04Django Rest framework解析器和渲染器詳解
這篇文章主要介紹了Django Rest framework解析器和渲染器詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07python判斷兩個(gè)序列的成員是否一樣的實(shí)例代碼
在本篇文章里小編給大家整理了關(guān)于python判斷兩個(gè)序列的成員是否一樣的實(shí)例代碼,需要的朋友們參考下。2020-03-03