18.5.7。 同期プリミティブ
ソースコード: :source: `Lib / asyncio / locks.py`
ロック:
セマフォ:
asyncioロックAPIは、スレッドモジュール(ロック、イベント、条件、セマフォ[ X151X]、 BoundedSemaphore )ですが、 timeout パラメーターはありません。 asyncio.wait_for()
関数を使用して、タイムアウト後にタスクをキャンセルできます。
18.5.7.1。 ロック
18.5.7.1.1。 ロック
- class asyncio.Lock(\*, loop=None)
プリミティブロックオブジェクト。
プリミティブロックは、ロックされたときに特定のコルーチンによって所有されない同期プリミティブです。 プリミティブロックは、「ロック」または「ロック解除」の2つの状態のいずれかになります。
ロック解除状態で作成されます。
acquire()
と release()の2つの基本的なメソッドがあります。 状態がロック解除されると、acquire()は状態をロックに変更し、すぐに戻ります。 状態がロックされると、別のコルーチンでrelease()を呼び出すとロックが解除されるまでacquire()がブロックされ、その後、acquire()呼び出しが状態をロックにリセットして戻ります。 release()メソッドは、ロックされた状態でのみ呼び出す必要があります。 状態をロック解除に変更し、すぐに戻ります。 ロック解除されたロックを解放しようとすると、 RuntimeError が発生します。状態がロック解除に変わるのを待っているacquire()で複数のコルーチンがブロックされている場合、release()呼び出しが状態をロック解除にリセットすると、1つのコルーチンのみが進行します。 Acquisition()でブロックされた最初のコルーチンが処理されています。
acquire()
はコルーチンであり、yield from
で呼び出す必要があります。ロックは、コンテキスト管理プロトコルもサポートします。
(yield from lock)
をコンテキストマネージャー式として使用する必要があります。このクラスはスレッドセーフではありません。
使用法:
コンテキストマネージャーの使用法:
ロックオブジェクトは、ロック状態をテストできます。
- locked()
ロックが取得された場合は、
True
を返します。
- release()
ロックを解除します。
ロックがロックされたら、ロック解除にリセットしてから戻ります。 ロックがロック解除されるのを待って他のコルーチンがブロックされている場合は、そのうちの1つだけを続行できるようにします。
ロック解除されたロックで呼び出されると、 RuntimeError が発生します。
戻り値はありません。
18.5.7.1.2。 イベント
- class asyncio.Event(\*, loop=None)
threading.Event と非同期のイベント実装。
イベントオブジェクトを実装するクラス。 イベントは、 set()メソッドでtrueに設定し、 clear()メソッドでfalseにリセットできるフラグを管理します。
wait()
メソッドは、フラグが真になるまでブロックします。 フラグは最初はfalseです。このクラスはスレッドセーフではありません。
- clear()
内部フラグをfalseにリセットします。 その後、
wait()
を呼び出すコルーチンは、 set()が呼び出されて内部フラグが再びtrueに設定されるまでブロックされます。
- is_set()
内部フラグがtrueの場合にのみ、
True
を返します。
- set()
内部フラグをtrueに設定します。 それが実現するのを待っているすべてのコルーチンが目覚めます。 フラグがtrueになると
wait()
を呼び出すコルーチンは、まったくブロックされません。
18.5.7.1.3。 状態
- class asyncio.Condition(lock=None, \*, loop=None)
threading.Condition と非同期の条件実装。
このクラスは、条件変数オブジェクトを実装します。 条件変数を使用すると、1つ以上のコルーチンが別のコルーチンから通知されるまで待機できます。
None
ではなく lock 引数が指定されている場合、それは Lock オブジェクトである必要があり、基になるロックとして使用されます。 それ以外の場合は、新しい Lock オブジェクトが作成され、基になるロックとして使用されます。このクラスはスレッドセーフではありません。
- notify(n=1)
デフォルトでは、この状態で待機している1つのコルーチンをウェイクアップします(存在する場合)。 このメソッドが呼び出されたときに呼び出し元のコルーチンがロックを取得していない場合、 RuntimeError が発生します。
このメソッドは、条件変数を待機しているコルーチンの最大 n をウェイクアップします。 コルーチンが待機していない場合、これはノーオペレーションです。
ノート
目覚めたコルーチンは、ロックを再取得できるようになるまで、
wait()
呼び出しから実際には戻りません。 notify()はロックを解放しないため、呼び出し元は解放する必要があります。
- locked()
基になるロックが取得された場合は、
True
を返します。
- notify_all()
この状態で待機しているすべてのコルーチンをウェイクアップします。 このメソッドは notify()のように機能しますが、待機中のコルーチンを1つではなくすべてウェイクアップします。 このメソッドが呼び出されたときに呼び出し元のコルーチンがロックを取得していない場合、 RuntimeError が発生します。
- release()
基になるロックを解放します。
ロックがロックされたら、ロック解除にリセットしてから戻ります。 ロックがロック解除されるのを待って他のコルーチンがブロックされている場合は、そのうちの1つだけを続行できるようにします。
ロック解除されたロックで呼び出されると、 RuntimeError が発生します。
戻り値はありません。
18.5.7.2。 セマフォ
18.5.7.2.1。 セマフォ
- class asyncio.Semaphore(value=1, \*, loop=None)
セマフォの実装。
セマフォは、
acquire()
呼び出しごとにデクリメントされ、 release()呼び出しごとにインクリメントされる内部カウンターを管理します。 カウンターがゼロを下回ることはありません。acquire()
がゼロを検出すると、ブロックし、他のコルーチンが release()を呼び出すまで待機します。セマフォは、コンテキスト管理プロトコルもサポートします。
オプションの引数は、内部カウンターの初期値を示します。 デフォルトは
1
です。 指定された値が0
より小さい場合、 ValueError が発生します。このクラスはスレッドセーフではありません。
- locked()
セマフォをすぐに取得できない場合は、
True
を返します。
- release()
セマフォを解放し、内部カウンタを1つ増やします。 エントリ時にゼロであり、別のコルーチンが再びゼロより大きくなるのを待っているときに、そのコルーチンをウェイクアップします。
18.5.7.2.2。 BoundedSemaphore
- class asyncio.BoundedSemaphore(value=1, \*, loop=None)
制限付きセマフォの実装。 セマフォから継承します。
これにより、値が初期値を超えて増加する場合、 release()で ValueError が発生します。