18.5.7. 同期プリミティブ—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.6/library/asyncio-sync
移動先:案内検索

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)をコンテキストマネージャー式として使用する必要があります。

このクラスはスレッドセーフではありません

使用法:

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を返します。

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 が発生します。