Lock
原始锁: 实现原始锁对象的类。一旦一个线程获得一个锁,会阻塞随后尝试获得锁的线程,直到它被释放;
任何线程都可以释放它。
class Lock:
def acquire(self, blocking=True, timeout=-1):
'''
blocking 阻塞: 阻塞状态下会维持到timeout时间然后抛出Runtime异常
非阻塞: 直接返回该锁状态(已锁---False 未锁---True)
timeout 定义超时时间,值为-1时不定义超时时间
'''
return False
def release(self):
'''
释放锁(任何线程都可以调用这个方法)
'''
pass
原始锁的原理相当的简单,就是一种互斥的机制,一个线程获取了该锁,其他线程就在获取锁的过程中发生阻塞或者返回一个状态码(bool),在此基础上实现下面的几种同步概念
RLock
可重入锁(递归锁),解决在同一线程中多次上锁引发的死锁问题
class RLock:
def __init__(self):
# 维护一个原始锁
self._block = Lock()
# 重入锁当前拥有者(线程id标识)
self._owner = None
# 当前拥有者的上锁次数
self._count = 0
def acquire(self, blocking=True, timeout=-1):
# 获取当前线程id
me = get_ident()
# 判断当前重入锁拥有者是否为自身
if self._owner == me:
# 如果为自身的就不阻塞而令count值 +1
self._count += 1
return 1
# 非拥有者则抢占锁(阻塞或返回True值表示该锁未有拥有者)
rc = self._block.acquire(blocking, timeout)
if rc:
# 未上锁情况下定义拥有者为自身
self._owner = me
self._count = 1
return rc
def release(self):
# 只允许拥有者自身解锁
if s