Python 10 生產者消費者模型

2022-08-21 17:27:11 字數 2837 閱讀 9996

平衡生產線程和消費執行緒的工作能力來提高程式的整體處理資料的速度。

程式中有兩類角色:生產資料、消費資料

實現方式:生產->佇列->消費。

通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞佇列裡取,阻塞佇列就相當於乙個緩衝區,平衡了生產者和消費者的處理能力。

通過佇列的方式實現了程式解耦(生產者不需要管消費者的消費能力,不斷的生產)

#訊息佇列作為中介軟體,接受生產者發來的訊息,並且供消費者拿走進行消費。

實現了非同步\

示例:

from multiprocessing import process,queue

import time,random,os

def consumer(q):

while true:

res=q.get()

time.sleep(random.randint(1,3))

print('\033[45m%s 吃 %s\033[0m' %(os.getpid(),res))

def producer(q):

for i in range(10):

time.sleep(random.randint(1,3))

res='滷肉%s' %i

q.put(res)

print('\033[44m%s 生產了 %s\033[0m' %(os.getpid(),res))

if __name__ == '__main__':

q=queue()

#生產者們:即製造東西

p1=process(target=producer,args=(q,))

#消費者們:即使用的

c1=process(target=consumer,args=(q,))

#開始p1.start()

c1.start()

print('主')

#這個示例會因最後生產者生產完了,但消費者取完後還在取一直阻塞在get()這裡。

生產者可以在自己生產完後停止往佇列中傳遞,但是消費者需要不斷的消費,在消費完生產的資料後無法停止,會一直處於等待狀態。

#若是在生產結束後傳送none,會因存在多個生產、消費者時發多個none訊號。

為了避免這種狀態,需要使用joinablequeue方法來實現結束的訊號。

joinablequeue 佇列允許專案的使用者通知生成者專案已經被成功處理。通知程序是使用共享的訊號和條件變數來實現的。

消費者在每次消費完後執行q.task_done() 往訊息佇列中傳送訊號,表示q.get()的返回專案已經被處理。如果呼叫此方法的次數大於從佇列中刪除專案的數量,將引發valueerror異常。

q.join() 呼叫此方法進行阻塞,直到佇列中所有的專案均被處理。阻塞將持續到佇列中的每個專案均呼叫q.task_done()方法為止。可以判斷生產者生產的個數與消費者消費的個數,並且關閉,q.join()需要加到生產者生產完(結束)後,判斷完成後會繼續執行主程序**,在執行完後還會被消費者的消費卡主,故把消費者設定成守護程序。 示例:

from multiprocessing import process,joinablequeue

import time,random,os

def consumer(q):

while true:

res=q.get()

time.sleep(random.randint(1,3))

print('\033[45m%s 吃 %s\033[0m' %(os.getpid(),res))

q.task_done() #向q.join()傳送一次訊號,證明乙個資料已經被取走了

def producer(name,q):

for i in range(10):

time.sleep(random.randint(1,3))

res='%s%s' %(name,i)

q.put(res)

print('\033[44m%s 生產了 %s\033[0m' %(os.getpid(),res))

q.join()

if __name__ == '__main__':

q=joinablequeue()

#生產者們:即製造東西

p1=process(target=producer,args=('肉',q))

p2=process(target=producer,args=('骨頭',q))

p3=process(target=producer,args=('饅頭',q))

#消費者們:即使用的

c1=process(target=consumer,args=(q,))

c2=process(target=consumer,args=(q,))

c1.daemon=true

c2.daemon=true

#開始p_l=[p1,p2,p3,c1,c2]

for p in p_l:

p.start()

p1.join()

p2.join()

p3.join()

print('主')

#主程序等--->p1,p2,p3等---->c1,c2

#p1,p2,p3結束了,證明c1,c2肯定全都收完了p1,p2,p3發到佇列的資料

#因而c1,c2也沒有存在的價值了,應該隨著主程序的結束而結束,所以設定成守護程序

python3 生產者消費者

code from queue import queue from threading import thread 用來表示終止的特殊物件 sentinel object a thread that produces data def producer out q for i in range 10...

5 12 生產者和消費者

一 生產者和消費者之間的關係 1 生產者將生產出來的資訊不斷存入乙個區域內,消費者將資訊從該區域內不斷讀取出來 生產者錄入資訊 消費者讀取資訊 例 電影票 public class movie public void setname string name public string getinfo...

6 1 生產者 消費者問題

在多執行緒程式中,執行緒之間通常存在分工。在一種常見模式中,一些執行緒是生產者,一些是消費者。需要強制執行幾個同步約束才能使此系統正常工作 在緩衝區中新增或刪除專案時,緩衝區處於不一致狀態。因此,執行緒必須具有對緩衝區的獨佔訪問許可權。如果消費者執行緒在緩衝區為空時到達,則會阻塞,直到生產者新增新專...