Pythonスレッド間の同期メカニズム2:RlockとCondition
2458 ワード
Rlock
ロック、pythonのthreadingライブラリには、再ロック可能なRlockも用意されています.
ロックについては、ロックがスレッドによって所有されているか、ロックがスレッドに属しているとは言えません.1つのスレッドがacquireを使用してロックをlocked状態に入れるため、どのスレッドもreleaseを呼び出してロックを「開く」--unlocked状態を回復することができます.
ここでのRlockはLockに比べて2つの特性を増加させた.
1.
2.
Condition
しかし、これらのお客様は必ず買い物ができますか?答えは必ずしもそうではない.最初のお客様は大金で、直接100単位を売り切れた可能性があります.後ろのお客様はすでに呼び覚まされていますが、在庫は0です.この時、確認メカニズムを増やさなければ、在庫はマイナスになる可能性があります.
ロック、pythonのthreadingライブラリには、再ロック可能なRlockも用意されています.
ロックについては、ロックがスレッドによって所有されているか、ロックがスレッドに属しているとは言えません.1つのスレッドがacquireを使用してロックをlocked状態に入れるため、どのスレッドもreleaseを呼び出してロックを「開く」--unlocked状態を回復することができます.
ここでのRlockはLockに比べて2つの特性を増加させた.
1.
Rlock
ロックは、あるスレッドが持つ(owned by the thread that locked it)スレッドT 1によってacquire
が呼び出された場合、releaseを呼び出してRlock
をunlocked状態に戻すことができるのはT 1のみである.Rlock
がT 1スレッドに奪われて家に帰ったのは、T 1スレッドが人を放さない限り、他のスレッドがacquire
にしようとするとブロックされることは理解できる(前編と同様に、blocking = False
の場合はここでは議論しない).2.
Rlock
は再入可能なロックであり、n層acquire
があれば、ロックを解除するにはn層releaseが必要である.Condition
Condition
条件変数--ロックの高度な形式.Condition
は、別のスレッドがnotify
またはnotify_all
メソッドを呼び出して「ローテーション」信号を発行するまで、複数のスレッドをサスペンションすることができ、以前にサスペンションされた複数またはすべてのスレッドがローテーションされる.Condition
スレッド間同期の実装にはロックが関与し、デフォルトの内蔵ロックはRLock
です..wait(timeout=None)
メソッド実行.wait()
は、内蔵ロックのrelease()を自動的に実行して停止します.これは、.wait()
を実行する前に、このスレッドがacquire()
から内蔵ロックに到達しなければならないことを示しています.そうしないと、RuntimeError
に報告されます.ブロックは、notify()
またはnotify_all
の信号を受信した後にすぐに終了しません.wait()
はロックの再取得を試みるため、nofity
のスレッドが手動でロックを解除するのを待たなければなりません..notify(n=1)
メソッドが.notify()
を実行する前に、このスレッドはacquire()
を内蔵ロックにしなければなりません.そうしないと、RuntimeError
に報告されます.放行信号を発し、n個の待機スレッドを放行し、.notify_all()
はすべての待機者を放行する.ただし、notify()メソッド自体が自動的にreleaseされないことに注意してください.releaseを手動で呼び出してロックの所有権を放棄してこそ、本当に待機者に実行を開始させる必要があります..wait_for(predicate, timeout=None)
の方法は、例えば、1つの消費者生産者モデルにおいて、消費者が在庫が0に遭遇したときにwait
になり、生産者が100単位の在庫を補充した後、notify_all
の信号を発し、wait
のすべての顧客がアクティブになるようにする.しかし、これらのお客様は必ず買い物ができますか?答えは必ずしもそうではない.最初のお客様は大金で、直接100単位を売り切れた可能性があります.後ろのお客様はすでに呼び覚まされていますが、在庫は0です.この時、確認メカニズムを増やさなければ、在庫はマイナスになる可能性があります.
wait_for
は、predicateパラメータがFalseである場合、waitを継続する確認メカニズムを提供する.time outタイムアウトを考慮せずに自動的に放行すると、実行に相当します.While not predicate:
condition.wait()
wait
がアクティブ化されるたびに、predicateがTrueであるかどうかは、下に進む前にもう一度確認されます.品物があってこそ購入し、品物がなくても待つしかない.