Asyncio中Lock部分的翻译

Asyncio中Lock部分的翻译

Locks

class asyncio.Lock(*, loop=None)

原始锁的对象。python

这个基础的锁是一个同步化的组件,当它上锁的时候就不属于典型的协程了(译者住:个人理解是由于上锁会阻塞住运行,因此协程也得停下来)。这个锁有两个状态,lockedunlocked安全

新建立的锁的初始状态是unlocked。锁有两个基本方法,acquire()release()。当锁的状态是unlocked()的时候,acquire()就会改变锁状态,也就是上锁,而后会马上返回。当锁的状态是locked的时候,若是这个时候调用acquire()acquire()会阻塞着,一直等到其余协程调用release()来释放锁,而后再马上上锁,接着返回。release()方法只应该在锁是locked()的时候调用,它会释放锁并马上返回,若是对unlocked状态的锁调用其release()方法,会抛出RuntimeError异常。async

当有多个协程的acquire()都在等待释放锁的时候,那么在释放锁的时候,也只会有一个协程会成功拿到锁,并且是第一个调用acquire()的协程会被执行(译者注:也就是FIFO罗)。oop

acquire()是一个协程操做,因此必须用yield from(译者注:如今是await了)。ui

Locks也支持上下文管理机制,yield from lock应该做为上下文管理中的表达方式。线程

这个LOCK类不是线程安全的。翻译

举个栗子code

lock = Lock()
...
yield from lock
try:
    ...
finally:
    lock.release()

举个上下文管理的栗子:协程

lock = Lock()
with (yield from lock):
    ...

锁对象的状态可以用来进行判断:对象

if not lock.locked():
    yield from lock
else:
    # lock is acquired
    ...

locked()

当锁被拿到的时候,返回True(译者注:其实就是锁是上锁状态的时候返回真)。

acquire()

拿锁,申请锁,要去拿锁。

这个方法会阻塞到锁被释放,而后又把锁上锁,并返回真。

这个方法是协程,要记得用await

release()

释放锁,开锁。

当锁是上锁状态时,会释放锁,而后返回。若是其余的协程都在等待锁被释放,那么只会选择它们其中一个来得到锁(就是最先申请锁的那个)。

当没上锁的锁调用这个方法的时候,会抛出RuntimeError异常。

这个方法没有返回值。

相关文章
相关标签/搜索