【pythonキュー】生産者消費者モデル


生産者消費者モデル:
ソフトウェア開発の過程で、いくつかのモジュールが生産データを担当し、これらのデータは他のモジュールが処理を担当するシーンによく遭遇します(ここでのモジュールは、関数、スレッド、プロセスなどです).データを生成するモジュールを生産者と呼び,データを処理するモジュールを消費者と呼ぶ.生産者と消費者の間のバッファを倉庫と呼ぶ.生産者は倉庫への商品の輸送を担当し、消費者は倉庫から商品を取り出すことを担当し、生産者消費者モデルを構成している.
生産者消費者モデルの利点
  • デカップリングは、生産者と消費者がそれぞれ2つのスレッドであると仮定する.生産者に消費者の方法を直接呼び出させると、生産者は消費者に依存する(すなわち結合する).将来消費者のコードが変化すると、生産者のコードに影響を及ぼす可能性があります.一方、両方がバッファに依存している場合、両者の間に直接依存しない場合、結合もそれに応じて低下します.

  • 例えば、郵便局に手紙を配達しに行きます.メールボックス(つまりバッファ)を使わない場合は、郵便配達員に直接手紙を渡さなければなりません.郵便配達員に直接渡すのは簡単ではないかという同窓会があります.実は簡単ではありません.誰が郵便配達員なのか知らなければ、彼に手紙を渡すことができません.これはあなたと郵便配達員の間の依存(生産者と消費者の強い結合に相当)を生み出しました.万一、郵便配達員が変わったら、もう一度認識しなければなりません(消費者の変化による生産者コードの修正に相当します).メールボックスは相対的に固定されており、それに依存するコストは低い(バッファとの弱い結合に相当する).
  • 同時生産者と消費者は2つの独立した同時体であり、彼らの間はバッファで通信しているため、生産者はバッファにデータを捨てるだけで、次のデータを生産し続けることができ、消費者はバッファからデータを取るだけで、お互いの処理速度のためにブロックが発生しない.

  • 上の例を続けて、もし私たちがメールボックスを使わないならば、郵便局で郵便配達員を待って、彼が帰ってくるまで、手紙を彼に渡しなければなりません.この間、私たちは何もできません(つまり生産者が渋滞しています).あるいは郵便配達員は家ごとに誰が手紙を送るのか(消費者のポーリングに相当する)を聞かなければならない.
  • は、生産者がデータを製造するのが速い場合、消費者は処理に間に合わず、未処理のデータは一時的にバッファに存在し、徐々に処理することができることをサポートしている.消費者のパフォーマンスによってデータが失われたり、生産者の生産に影響を与えたりすることはありません.

  • 私たちが手紙を送る例を取って、郵便配達員が一度に1000通の手紙しか持っていけないと仮定して、万が一バレンタインデー(またはクリスマス)にカードを送ると、送る手紙が1000通を超えると、メールボックスというバッファが役に立ちます.郵便配達人は持っていくのに間に合わない手紙をメールボックスに預けて、今度来る時に持って行きます.
    例を挙げます.
    import threading,time,random,queue
    def product(num):
     '''     ,          '''
     c = threading.Thread(target = customer)           #        ,        ,    ,    
     c.setDaemon(True)   #      empty()  ,        ,      
     c.start()
    
     count = 0          #    
     while count  
      

     

    http://python.jobbole.com/87592/