生產者消費者模型的簡單認識

2021-08-27 08:09:29 字數 1751 閱讀 7490

一.生產者消費者模型

生產者:程式中負責產生資料的任務

消費者:程式中負責處理資料的任務

模型:就是模板

生產者----->共享的介質(佇列)------->消費者

生產者只與佇列溝通,消費者也只與佇列溝通.

二.為何用生產者消費者模型

實現了生產者與消費者之間的解耦和

生產者可以不停的生產,消費者可以不停的消費,從而平衡了生產者的生產能力與消費者的消費能力.提公升了程式的執行效率.

當我們程式中明顯存在兩種任務,一種負責產生資料,一種負責處理資料,那麼我們可以用生產者消費者模型.

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...

生產者消費者模型

當佇列滿時,生產者需要等待佇列有空間才能繼續往裡面放入商品,而在等待的期間內,生產者必須釋放對臨界資源 即佇列 的占用權。因為生產者如果不釋放對臨界資源的占用權,那麼消費者就無法消費佇列中的商品,就不會讓佇列有空間,那麼生產者就會一直無限等待下去。因此,一般情況下,當佇列滿時,會讓生產者交出對臨界資...