ホームページ  >  記事  >  バックエンド開発  >  Python Condition オブジェクトのプロデューサーおよびコンシューマー操作のコード例

Python Condition オブジェクトのプロデューサーおよびコンシューマー操作のコード例

Y2J
Y2Jオリジナル
2017-05-04 11:19:091781ブラウズ

この記事では、主に 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==&#39;main&#39;:
  test()

上記のコードは、消費者がすぐに消費することを想定しており、出力結果は次のようになります:

以上がPython Condition オブジェクトのプロデューサーおよびコンシューマー操作のコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。