一.生產者消費者模型生產者:程式中負責產生資料的任務
消費者:程式中負責處理資料的任務
模型:就是模板
生產者----->共享的介質(佇列)------->消費者
生產者只與佇列溝通,消費者也只與佇列溝通.
二.為何用生產者消費者模型實現了生產者與消費者之間的解耦和
生產者可以不停的生產,消費者可以不停的消費,從而平衡了生產者的生產能力與消費者的消費能力.提公升了程式的執行效率.
當我們程式中明顯存在兩種任務,一種負責產生資料,一種負責處理資料,那麼我們可以用生產者消費者模型.
import time
import random
from multiprocessing import process, joinablequeue
def producer(name, food, q):
for i in range(3):
res = '%s%s' % (food, i)
time.sleep(random.randint(1, 3))
# 放進佇列
q.put(res)
print('\033[45m%s 生產了%s\033[0m' % (name, res))
def consumer(name, q):
while true:
# 從佇列裡取走
res = q.get()
time.sleep(random.randint(1, 3))
print('\033[46m%s 吃了%s\033[0m' % (name, res))
q.task_done() # 只是告訴佇列有乙個資料被取走了,並不代表結束
if __name__ == '__main__':
# 先造乙個佇列
q = joinablequeue()
# 生產者們
p1 = process(target=producer, args=('egon', '包子', q,))
p2 = process(target=producer, args=('tom', '饅頭', q,))
p3 = process(target=producer, args=('bob', '點心', q,))
# 消費者們
c1 = process(target=consumer, args=('alex', q,))
c2 = process(target=consumer, args=('aaa', q,))
# 開子程序的目的就是為了併發執行任務,而併發執行的任務它的生命週期伴隨著主程序結束任務而結束掉,所以用到了守護程序
c1.daemon = true
c2.daemon = true
p1.start()
p2.start()
p3.start()
c1.start()
c2.start()
p1.join()
p2.join()
p3.join()
q.join() # 讓主程序等q結束,等待佇列被取乾淨
# q.join()意味著主程序的**執行完畢--->(生產者執行完畢)+佇列中的資料也被取乾淨--->消費者全部取完資料,沒有存在的意義
print('主')
生產者消費者模型
1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...
生產者消費者模型
生產者與消費者 3,2,1 三種關係 生產者與消費者 互斥,同步 消費者與消費者 互斥 生產者與生產者 互斥 條件變數 int pthread cond destroy pthread cond t cond int pthread cond init pthread cond t restrict...
生產者消費者模型
當佇列滿時,生產者需要等待佇列有空間才能繼續往裡面放入商品,而在等待的期間內,生產者必須釋放對臨界資源 即佇列 的占用權。因為生產者如果不釋放對臨界資源的占用權,那麼消費者就無法消費佇列中的商品,就不會讓佇列有空間,那麼生產者就會一直無限等待下去。因此,一般情況下,當佇列滿時,會讓生產者交出對臨界資...