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()
...
...