web-dev-qa-db-ja.com

threading.Condition vs threading.Event

ConditionモジュールのEventクラスとthreadingクラスの違いについての明確な説明はまだ見つかりません。一方が他方よりも役立つ明確なユースケースはありますか?私が見つけることができるすべての例では、例として生産者/消費者モデルを使用しています。ここで、queue.Queueはより簡単な解決策になります。

43
Parker Ault

簡単に言えば、スレッドが何かが真になるのを待つことに関心がある場合は、条件を使用しますそして、真になると、共有リソースへの排他的アクセスが可能になります。

一方、スレッドが何かが真になるのを待つことに関心がある場合は、イベントを使用します。

本質的に、Conditionは抽象化されたEvent + Lockですが、同じ基になるロックに対して複数の異なる条件を持つことができると考えると、より興味深いものになります。したがって、基になるリソースの状態を説明するさまざまな条件を持つことができます。つまり、共有リソースの特定の状態にのみ関心があるワーカーをウェイクアップできます。

62
donkopotamus

もう1つの微妙な違いは、Eventset()wait()の今後の呼び出しに影響することです(つまり、wait()の後続の呼び出しはTrueを返し、勝ちますclear()が呼び出されるまでブロックしません)が、Conditionnotify()(またはnotify_all())はブロックしません(wait()の後続の呼び出しはブロックします) notify()の次の呼び出しまでブロックします)。

3
Eran Friedman