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異常。

這個方法沒有返回值。

相關文章
相關標籤/搜索