生產者消費者模式概述
在并發編程中使用生產者和消費者模式能夠解決大不多的并發問題,該模式通過平衡生產執行緒和消費執行緒的作業能力來提高程式的整體處理資料的速度,
為什么使用生產者消費者模式
在執行緒世界里,生產者就是生產資料的執行緒,消費者就是消費資料的執行緒,在多執行緒開發中,如果生產者處理速度很快,而消費者處理速度很慢,那么生產者就必須等待消費者處理完才能繼續生產資料,同樣的道理,如果消費者的處理能力大于生產者,那么消費者就必須等待生產者,為了解決這個問題引入了生產者和消費者模式,
什么是生產者消費者模式
生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題,生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之后不用通過等待消費者處理,直接扔給阻塞佇列,消費者不著生產者拿資料,而是直接從阻塞佇列中取,阻塞佇列相當于一個緩沖區,平衡了生產者和消費者的處理能力,

代碼案例
import threading
import queue
import time
#定義一個生產者
def producer():
count = 0
#判斷佇列中任務的數量
while q.qsize()<5:
print('第%s頓飯......',count)
q.put(count)
count+=1
time.sleep(1)
#定義一個消費者
def consumer(name):
while True:
print("%s 吃了第%s飯" % (name,q.get()))
#定義一個佇列
q = queue.Queue(maxsize=4)
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer,args=('jibu',))
t1.start()
t2.start()
結果:
第%s頓飯...... 0
jibu 吃了第0飯
第%s頓飯...... 1
jibu 吃了第1飯
第%s頓飯...... 2
jibu 吃了第2飯
第%s頓飯...... 3
jibu 吃了第3飯
第%s頓飯...... 4
jibu 吃了第4飯
第%s頓飯...... 5
jibu 吃了第5飯
第%s頓飯...... 6
jibu 吃了第6飯
第%s頓飯...... 7
jibu 吃了第7飯
第%s頓飯...... 8
# 另外,如果供大于求或者求大于供,可以在相對小的一方在增加執行緒的數量
當然如果需要進一步優化可以讓消費者執行完佇列中所有任務的時候告訴生產者一聲
import threading
import queue
import time
#定義一個生產者
def producer():
count = 0
#判斷佇列中任務的數量
for i in range(5):
print('第%s頓飯......',count)
q.put(count)
count+=1
time.sleep(1)
q.join()
#定義一個消費者
def consumer(name):
while True:
print("%s 吃了第%s飯" % (name,q.get()))
q.task_done()
print('消費者執行完了所有任務')
#定義一個佇列
q = queue.Queue(maxsize=4)
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer,args=('jibu',))
t1.start()
t2.start()
結果
第0頓飯......
jibu 吃了第0飯
消費者執行完了所有任務
第1頓飯......
jibu 吃了第1飯
消費者執行完了所有任務
第2頓飯......
jibu 吃了第2飯
消費者執行完了所有任務
第3頓飯......
jibu 吃了第3飯
消費者執行完了所有任務
第4頓飯......
jibu 吃了第4飯
消費者執行完了所有任務
結論:
生產者消費者的2個主要作用
1.程式的解耦合
2.程式的異步執行,提高了程式的運行效率(在排隊的時候可以做別的事,過一會可以回來拿這個結果)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297785.html
標籤:其他
