class Lock:
"""
协程锁对象
"""
def __init__(self, *, loop=None):
# 创建一个_waiters等待队列,用于在锁被释放时恢复当前协程,实际上_waiters存储的是每一个被挂起的协程任务,
# 似乎说协程任务不太准确,更准确一点应该是挂起的协程的一个断点位置对象
self._waiters = collections.deque()
# 标识符,用于标记锁的状态
self._locked = False
# 获取事件循环
if loop is not None:
self._loop = loop
else:
self._loop = events.get_event_loop()
def locked(self):
"""
查看当前锁是释放还是锁住的状态
"""
return self._locked
@coroutine
def acquire(self):
"""
获取锁
"""
# 如果没有被某个协程锁定,或者所有被挂起来的协程都被取消了,那么立即返回,让协程得到锁并且设置标识符为True
if not self._locked and all(w.cancelled() for w in self._waiters):
self._locked = T