“递归锁:RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次acquire。直到一个线程所有的acquire都被release,其他的线程才能获得资源。”
近期因工作需要刚学Python,在网上找了些其递归锁的例子,当多线程运行时,其例子不是很好理解其核心说明,故参考C++封装自释放锁对象,使用构造函数和析构函数自动获取锁和释放锁来演示其在递归函数场景下的应用,感觉更好理解python递归锁:同线程可多次进行锁申请和释放计数,其他线程需等待其锁次数释放为0才能使用,代码如下:
import threading
import time
# 递归锁threading.RLock
ARLock = threading.RLock()
class myRLock():
def __init__(self, threadName):
self.threadName = threadName
global ARLock
ARLock.acquire()
print(self.threadName + ' afunc ARLock acq ')
def __del__(self):
global ARLock
ARLock.release()
print(self.threadName + ' afunc ARLock rel ')
class myThread(threading.Thread):
def __init__(self, threadName):
super().__init__()
self.threadName = threadName
def run(self):
print(self.threadName + ' start')
self.afunc(5)
#递归函数
def afunc(self, calcnum):
tempRLock = myRLock(self.threadName)
time.sleep(1)
if calcnum == 1:
print(self.threadName + ' afunc ARLock last step ')
return 1
else:
calcnum -= 1
return self.afunc(calcnum)
print('begin')
thl = []
th1 = myThread('Thread-1')
th2 = myThread('Thread-2')
thl.append(th1)
thl.append(th2)
th1.start()
th2.start()
for th in thl:
th.join()
print("递归-所有线程已退出")
运行结果如下:
# 实际运行时,线程1和2都有可能先执行 # begin # Thread-2 start # Thread-2 afunc ARLock acq # Thread-1 start #注意,线程1虽然启动,但并未获得锁,而是在等待。线程2多次获取锁 # Thread-2 afunc ARLock acq # Thread-2 afunc ARLock acq # Thread-2 afunc ARLock acq # Thread-2 afunc ARLock acq # Thread-2 afunc ARLock last step # Thread-2 afunc ARLock rel # Thread-2 afunc ARLock rel # Thread-2 afunc ARLock rel # Thread-2 afunc ARLock rel # Thread-2 afunc ARLock rel # Thread-1 afunc ARLock acq # Thread-1 afunc ARLock acq # Thread-1 afunc ARLock acq # Thread-1 afunc ARLock acq # Thread-1 afunc ARLock acq # Thread-1 afunc ARLock last step # Thread-1 afunc ARLock rel # Thread-1 afunc ARLock rel # Thread-1 afunc ARLock rel # Thread-1 afunc ARLock rel # Thread-1 afunc ARLock rel # 递归-所有线程已退出
补充信号量递归测试结果:
将上面代码中的ARLock = threading.RLock()替换为信号量ARLock = threading.Semaphore(5) #创建信号量,(5表示这个锁同时支持的个数)
可以看出:信号量支持不同线程间总获取锁的数量,但是不支持递归锁。