用該模型有個蛇好處?
生產者消費者模型當中有兩大類重要的角色,乙個是生產者(負責造資料的任務),另乙個是消費者(接收造出來的資料進行進一步的操作)。
生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料
之後不用等待消費者處理,直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞
佇列裡取,阻塞佇列就相當於乙個緩衝區,平衡了生產者和消費者的處理能力。
這就像,在餐廳,廚師做好菜,不需要直接和客戶交流,而是交給前台,而客戶去飯菜也不
需要不找廚師,直接去前台領取即可。
在併發程式設計中,如果生產者處理速度很快,而消費者處理速度比較慢,那麼生產者就必須等待消費者處理完,才能繼續生產資料。同樣的道理,如果消費者的處理能力大於生產者,那麼消費者就必須等待生產者。為了解決這個等待的問題,就引入了生產者與消費者模型。讓它們之間可以不停的生產和消費。
實現生產者消費者模型三要素:
1、生產者
2、消費者
3、佇列(或其他的容哭器,但佇列不用考慮鎖的問題)
什麼時候用這個模型?
程式**現明顯的兩類任務,一類任務是負責生產,另外一類任務是負責處理生產的資料的(如爬蟲)
1、實現了生產者與消費者的解耦和
2、平衡了生產力與消費力,就是生產者一直不停的生產,消費者可以不停的消費,因為二者不再是直接溝通的,而是跟佇列溝通的。
來簡單的寫乙個執行緒的生產者消費者模型:
# 匯入time模組
import time
# 匯入執行緒模組
from threading import thread
# 匯入佇列模組
from queue import queue
# 建立佇列
q = queue(10)
# 廚師初始生產的包子
# 定義生產者
defproducer
(name)
: count =
1# 給生產出來的包子計數
# 一直生產包子
while
true
: q.join(
)# join在這裡會等待,直至task_done()傳送訊號後,再放行
q.put(count)
print
('生產者%s正在生產第%d個包子'
%(name,count)
) count+=
1 time.sleep(2)
# 定義消費者
defcustomer
(name)
: count =
1# 給消費者吃了的包子計數
# 一直獲取包子
while
true
: bao_zi = q.get(
)#獲取廚師佇列中的包子
print
('消費者%s正在吃第%d個包子'
%(name,bao_zi)
) count +=
1 q.task_done(
)# put和get一次之後,取完包子後給join傳送訊號
time.sleep(1)
if __name__ ==
'__main__'
:# 設定t1執行緒
t1 = thread(target=producer,args=
('劉大廚',)
)# 設定t2執行緒
t2 = thread(target=customer,args=
('翠花',)
)# 啟動執行緒
t1.start(
) t2.start(
)
關鍵的兩個方法
task_done():消費者用此方法發出資訊,表示q.get()的返回專案已經被處理。如果呼叫此方法的次數大於從佇列中刪除專案的數量,將會導致valueerror異常。
join():生產者呼叫此方法進行阻塞,直到佇列中所有的專案都被處理了。
Python 生產者與消費者模型
定義 在併發程式設計中使用生產者和消費者模式能夠解決絕大多數併發問題。該模式通過平衡生產線程和消費執行緒的工作能力來提高程式的整體處理資料的速度。為什麼要使用生產者和消費者模式 什麼是生產者消費者模式 生產者消費者模式是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,...
Python 生產者消費者模型
生產者消費者模型 我們都知道實現生產者消費者模型的三要素 寫乙個簡單的生產者消費者模型的例子 coding utf 8 import time,threading,queue,random 佇列 先入先出 q queue.queue 生產者 def producer for i in range 1...
Python 生產者 消費者模型
生產者 消費者模型是多執行緒同步的經典案例 此模型中生產者向緩衝區push資料,消費者從緩衝區中pull資料 這個demo中緩衝區用python實現的queue來做,這個模組是執行緒安全的使我不用再為佇列增加額外的互斥鎖.此外這個demo中訊號處理的實現是這樣的 1 主線程接到乙個sigterm的訊...