この記事では、主に Python 条件変数のプロデューサー操作とコンシューマー操作を紹介し、具体的な例の形で Python 条件変数のスレッド操作の概念、原理、および関連スキルを分析します。この記事では、Python 条件変数のプロデューサーとコンシューマーの操作について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
Mutex ロックは、複雑なスレッド同期の問題に対処するために、Condition
オブジェクトも提供します。 Condition は条件変数と呼ばれ、Lock と同様の取得メソッドと解放メソッドを提供するだけでなく、待機メソッドと通知メソッドも提供します。スレッドは最初に条件変数を取得し、次にいくつかの条件を決定します。条件が満たされていない場合は待機し、条件が満たされている場合は、条件を変更するための処理を行った後、wait状態の他のスレッドは通知を受け取った後に条件を再判断します。 。このプロセスは、複雑な同期問題を解決するために継続的に繰り返されます。 Condition オブジェクトはロック (Lock/RLock) と待機プールを維持すると考えることができます。スレッドは取得を通じて Condition オブジェクトを取得します。 wait メソッドが呼び出されると、スレッドは Condition 内のロックを解放してブロック状態に入り (ただし、実際には現在のスレッドはブロックされません)、このスレッドを待機プールに記録します。通知メソッドが呼び出されると、Condition オブジェクトは待機プールからスレッドを選択し、取得メソッドを呼び出してロックの取得を試みるよう通知します。
Condition オブジェクトの
constructorは、Lock/RLock オブジェクトをパラメータとして受け入れることができます。指定されていない場合、Condition オブジェクトは内部で RLock を作成します。 スレッド同期の古典的な問題、プロデューサーとコンシューマーの問題は、条件変数を使用して簡単に解決できます。
import threading import time class Producer(threading.Thread): def init(self): threading.Thread.init(self) def run(self): global count while True: con.acquire() if count <20: count += 1 print self.name," Producer product 1,current is %d" %(count) con.notify() else: print self.name,"Producer say box is full" con.wait() con.release() time.sleep(1) class Consumer(threading.Thread): def init(self): threading.Thread.init(self) def run(self): global count while True: con.acquire() if count>4: count -=4 print self.name,"Consumer consume 4,current is %d" %(count) con.notify() else: con.wait() print self.name," Consumer say box is empty" con.release() time.sleep(1) count = 0 con = threading.Condition() def test(): for i in range(1): a = Consumer() a.start() for i in range(1): b =Producer() b.start() if name=='main': test()
上記のコードは、消費者がすぐに消費することを想定しており、出力結果は次のようになります:
以上がPython Condition オブジェクトのプロデューサーおよびコンシューマー操作のコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。