Python递归锁说明举例

“递归锁: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表示这个锁同时支持的个数)


可以看出:信号量支持不同线程间总获取锁的数量,但是不支持递归锁。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值