並行プログラミングのネットワークプログラミング - 生産者 - 消費者モデル
まず、生産者 - 消費者モデル導入
なぜ生産者 - 消費者モデルを使うのか?
生産者は、生産データのタスクを指し、消費者は、データ処理のタスクを指します。並行プログラミングでは、プロデューサーは、消費者の処理速度が非常に遅いですが、その後、プロデューサーは、生産データを継続するために、処理された消費者を待たなければならない、すぐに処理した場合に。同様に、消費者の能力は、私がプロデューサーを待つ必要がどのような消費者の生産よりも大きい場合。その生産者と消費者のパターンの導入をこの問題を解決するには。
生産者と消費者のモデルとは何ですか?
生産者 - 消費者モデルは、容器の生産者と消費者によって解決される強い結合の問題です。生産者と消費者が直接相互に通信していない、とキューを遮断することによって通信する、消費者を待たずに本番データの処理が完了した後にプロデューサーので、直接スローのブロッキングキューは、消費者がデータへのプロデューサーを見つけることができませんが、キューをブロックから直接採取し、キューが処理能力の生産者と消費者のバランスをとる、ブロッキングバッファーに相当します。
ブロッキングキューは、生産者と消費者を分離するために使用されます。
第二に、生産者 - 消費者モデルの実装
生産者 - 消費者モデルを実装するには、キューの研究部に基づいています。
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('主')