python线程学习-Python多线程Rlock

RLock

RLock 是一个可重用的 lock.acquire()可以在复合事件内被同一个线程调用而无须阻塞。记住,
release()方法需要在相同的时间点被调用来解锁资源
 
使用Lock,在相同的线程第2次调用acquire()=时,将产生阻塞:
 
lock = threading.Lock()
lock.acquire()
lock.acquire()
 
如果你使用RLock,在第2次调用acquire()时,将不会产生阻塞:
rlock = threading.RLock()
rlock.acquire()
rlock.acquire()
RLock也使用thread.allocate_lock() 方法,但是它提供给主线程可重用的特性。当线程调用
acquire()方法请求锁定资源所有者线程时,计数器依次-1,如果允许则锁定资源,当资源第一次被锁定的时候,
资源所有者将保存并把它的计数器重置为1
def acquire(self, blocking=1):
    me = _get_ident()
    if self.__owner == me:
        self.__count = self.__count + 1
        ...
        return 1
    rc = self.__block.acquire(blocking)
    if rc:
        self.__owner = me
        self.__count = 1
        ...
    ...
    return rc
继续看RLock release()方法。首先检查调用该方法的线程是不是锁的所有者,计数器是不是被减状态
计数器是不是等于0且资源未被锁定,然后运行其他线程获取该资源
def release(self):
    if self.__owner != _get_ident():
        raise RuntimeError("cannot release un-acquired lock")
    self.__count = count = self.__count - 1
    if not count:
        self.__owner = None
        self.__block.release()
        ...
    ...