python RLock的理解

作者在工作中查看同事代码时,发现使用cacheout库做缓存,研究其最早版本源代码中添加数据的逻辑。发现add_many和add方法都需获锁,RLock可被同一线程多次获取,而Lock会在同一线程中阻塞。通过测试代码得出此结论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

        在工作中在看同事代码时看到了使用cacheout的库做缓存,于是去看了下其最早版本的源代码
        在添加数据的逻辑中看到了这样的代码,_lock为一个RLock

	@_lock
    def add(self, key, value, ttl=None):
        if self.has(key):
            return
        self.set(key, value, ttl=ttl)

    @_lock
    def add_many(self, items, ttl=None):
        for key, value in items.items():
            self.add(key, value, ttl=ttl)

        可以看到,在上面的代码中add_many获得了锁,而其中调用的方法add也需要获得锁,但是这种方式可以正常运行,则表明在同一个线程中RLock可以被相同的线程获得多次

测试代码

from threading import RLock, Thread, Lock


class Test:
    def __init__(self, lock):
        self._lock = lock

    def func1(self):
        with self._lock:
            print('1')

    def func2(self):
        with self._lock:
            print('2')
            self.func1()


if __name__ == '__main__':
    _rlock = RLock()
    _lock = Lock()
    test1 = Test(_rlock)
    t1 = Thread(target=test1.func2)
    t1.start()
    t1.join()
    print('-' * 50)
    test2 = Test(_lock)
    t2 = Thread(target=test2.func2)
    t2.start()
    t2.join()

运行结果如下

2
1
--------------------------------------------------
2

可以得出结论,使用Lock将会在同一个线程中阻塞住,如果这个线程中调用的函数也需要获取相同的锁,而使用RLock则不会

参考资料

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值