並行プログラミングのネットワークプログラミング - 生産者 - 消費者モデル

並行プログラミングのネットワークプログラミング - 生産者 - 消費者モデル

まず、生産者 - 消費者モデル導入

なぜ生産者 - 消費者モデルを使うのか?

生産者は、生産データのタスクを指し、消費者は、データ処理のタスクを指します。並行プログラミングでは、プロデューサーは、消費者の処理速度が非常に遅いですが、その後、プロデューサーは、生産データを継続するために、処理された消費者を待たなければならない、すぐに処理した場合に。同様に、消費者の能力は、私がプロデューサーを待つ必要がどのような消費者の生産よりも大きい場合。その生産者と消費者のパターンの導入をこの問題を解決するには。

生産者と消費者のモデルとは何ですか?

生産者 - 消費者モデルは、容器の生産者と消費者によって解決される強い結合の問題です。生産者と消費者が直接相互に通信していない、とキューを遮断することによって通信する、消費者を待たずに本番データの処理が完了した後にプロデューサーので、直接スローのブロッキングキューは、消費者がデータへのプロデューサーを見つけることができませんが、キューをブロックから直接採取し、キューが処理能力の生産者と消費者のバランスをとる、ブロッキングバッファーに相当します。

ブロッキングキューは、生産者と消費者を分離するために使用されます。

第二に、生産者 - 消費者モデルの実装

生産者 - 消費者モデルを実装するには、キューの研究部に基づいています。

from multiprocessing import Process,Queue
import time,random,os
def consumer(q,name):
    while True:
        res=q.get()
        time.sleep(random.randint(1,3))
        print('\033[43m%s 吃 %s\033[0m' %(name,res))
def producer(q,name,food):
    for i in range(3):
        time.sleep(random.randint(1,3))
        res='%s%s' %(food,i)
        q.put(res)
        print('\033[45m%s 生产了 %s\033[0m' %(name,res))
if __name__ == '__main__':
    q=Queue()
    #生产者们:即厨师们
    p1=Process(target=producer,args=(q,'egon','包子'))
    #消费者们:即吃货们
    c1=Process(target=consumer,args=(q,'alex'))
    #开始
    p1.start()
    c1.start()
    print('主')

結果:

主
egon 生产了 包子0
egon 生产了 包子1
alex 吃 包子0
alex 吃 包子1
egon 生产了 包子2
alex 吃 包子2

空のQをとった後のp、それが終了した後、生産の生産が、消費者Cは、(死のサイクルに残ったとq.getに従事していますので、この時点では、主な問題は、プロセスが終了したことがないということです)このステップ。

解決策が、信号の終わりは死のサイクルから抜け出すことができた後、消費者が再び受信するよう生産は、キューの最後に、完成した後、信号を送信した後、それが生産することができます。

from multiprocessing import Process,Queue
import time,random,os
def consumer(q,name):
    while True:
        res=q.get()
        if res is None:break
        time.sleep(random.randint(1,3))
        print('\033[43m%s 吃 %s\033[0m' %(name,res))
def producer(q,name,food):
    for i in range(3):
        time.sleep(random.randint(1,3))
        res='%s%s' %(food,i)
        q.put(res)
        print('\033[45m%s 生产了 %s\033[0m' %(name,res))
if __name__ == '__main__':
    q=Queue()
    #生产者们:即厨师们
    p1=Process(target=producer,args=(q,'egon','包子'))
    #消费者们:即吃货们
    c1=Process(target=consumer,args=(q,'alex'))
    #开始
    p1.start()
    c1.start()
    p1.join()
    q.put(None)
    print('主')

かなり低い:ただし、上記の解決策、複数のプロデューサと複数のコンシューマがある場合、我々はその後、非常に低い解決する方法を選択し、いくつかの最終消費者は、複数の信号を送信する必要があります。例えば:

from multiprocessing import Process,Queue
import time,random,os
def consumer(q,name):
    while True:
        res=q.get()
        if res is None:break
        time.sleep(random.randint(1,3))
        print('\033[43m%s 吃 %s\033[0m' %(name,res))
def producer(q,name,food):
    for i in range(3):
        time.sleep(random.randint(1,3))
        res='%s%s' %(food,i)
        q.put(res)
        print('\033[45m%s 生产了 %s\033[0m' %(name,res))
if __name__ == '__main__':
    q=Queue()
    #生产者们:即厨师们
    p1=Process(target=producer,args=(q,'egon1','包子'))
    p2=Process(target=producer,args=(q,'egon2','骨头'))
    p3=Process(target=producer,args=(q,'egon3','泔水'))
    #消费者们:即吃货们
    c1=Process(target=consumer,args=(q,'alex1'))
    c2=Process(target=consumer,args=(q,'alex2'))
    #开始
    p1.start()
    p2.start()
    p3.start()
    c1.start()
    c2.start()
    p1.join()
    p2.join()
    p3.join()
    q.put(None)
    q.put(None)
    q.put(None)
    print('主')

デジタル

おすすめ

転載: www.cnblogs.com/Kwan-C/p/11589248.html