前言
在工作中在看同事代码时看到了使用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则不会