Pythonスレッド間の同期メカニズム2:RlockとCondition

2458 ワード

Rlock
ロック、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であるかどうかは、下に進む前にもう一度確認されます.品物があってこそ購入し、品物がなくても待つしかない.