原始鎖的對象。python
這個基礎的鎖是一個同步化的組件,當它上鎖的時候就不屬於典型的協程了(譯者住:個人理解是由於上鎖會阻塞住運行,因此協程也得停下來)。這個鎖有兩個狀態,locked
和unlocked
。安全
新建立的鎖的初始狀態是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 ...
當鎖被拿到的時候,返回True
(譯者注:其實就是鎖是上鎖狀態的時候返回真)。
拿鎖,申請鎖,要去拿鎖。
這個方法會阻塞到鎖被釋放,而後又把鎖上鎖,並返回真。
這個方法是協程,要記得用await
。
釋放鎖,開鎖。
當鎖是上鎖狀態時,會釋放鎖,而後返回。若是其餘的協程都在等待鎖被釋放,那麼只會選擇它們其中一個來得到鎖(就是最先申請鎖的那個)。
當沒上鎖的鎖調用這個方法的時候,會拋出RuntimeError
異常。
這個方法沒有返回值。