摘要:為什么使用生產者消費者模式在線程世界里,生產者就是生產數據的線程,消費者就是消費數據的線程。什么是生產者消費者模式生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題。
在并發編程中使用生產者和消費者模式能夠解決大不多的并發問題。該模式通過平衡生產線程和消費線程的工作能力來提高程序的整體處理數據的速度。
在線程世界里,生產者就是生產數據的線程,消費者就是消費數據的線程。在多線程開發中,如果生產者處理速度很快,而消費者處理速度很慢,那么生產者就必須等待消費者處理完才能繼續生產數據。同樣的道理,如果消費者的處理能力大于生產者,那么消費者就必須等待生產者。為了解決這個問題引入了生產者和消費者模式。
生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞隊列來進行通訊,所以生產者生產完數據之后不用通過等待消費者處理,直接扔給阻塞隊列,消費者不著生產者拿數據,而是直接從阻塞隊列中取,阻塞隊列相當于一個緩沖區,平衡了生產者和消費者的處理能力。
代碼案例
import threadingimport queueimport 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頓飯...... 0jibu 吃了第0飯第%s頓飯...... 1jibu 吃了第1飯第%s頓飯...... 2jibu 吃了第2飯第%s頓飯...... 3jibu 吃了第3飯第%s頓飯...... 4jibu 吃了第4飯第%s頓飯...... 5jibu 吃了第5飯第%s頓飯...... 6jibu 吃了第6飯第%s頓飯...... 7jibu 吃了第7飯第%s頓飯...... 8# 另外,如果供大于求或者求大于供,可以在相對小的一方在增加線程的數量
當然如果需要進一步優化可以讓消費者執行完隊列中所有任務的時候告訴生產者一聲
import threadingimport queueimport 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.程序的異步執行,提高了程序的運行效率(在排隊的時候可以做別的事,過一會可以回來拿這個結果)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119307.html
摘要:在生產者與消費者之間的緩沖區稱之為倉庫。生產者負責往倉庫運輸商品,而消費者負責從倉庫里取出商品,這就構成了生產者消費者模式。中的多線程編程在實現生產者消費者模式之前,我們先學習下中的多線程編程。 什么是生產者消費者模式 在軟件開發的過程中,經常碰到這樣的場景:某些模塊負責生產數據,這些數據由其他模塊來負責處理(此處的模塊可能是:函數、線程、進程等)。產生數據的模塊稱為生產者,而處理數據...
摘要:交易所在本教程的前幾部分中,我們發送消息并從隊列中接收消息。消費者是接收消息的用戶的應用程序。中的消息傳遞模型的核心思想是生產者永遠不會將任何消息直接發送到隊列中。交換和隊列之間的關系稱為綁定。 源碼:https://github.com/ltoddy/rabbitmq-tutorial 發布 / 訂閱 (using the Pika Python client) 本章節教程重點介紹的...
摘要:多進程執行任務結束,創建進程和銷毀進程是時間的,如果長度不夠,會造成多線程快過多進程多線程執行任務結束,進程間通信生產者消費者模型與隊列演示了生產者和消費者的場景。 進程 Python是運行在解釋器中的語言,查找資料知道,python中有一個全局鎖(GIL),在使用多進程(Thread)的情況下,不能發揮多核的優勢。而使用多進程(Multiprocess),則可以發揮多核的優勢真正地提...
閱讀 3054·2023-04-26 00:40
閱讀 2391·2021-09-27 13:47
閱讀 4197·2021-09-07 10:22
閱讀 2966·2021-09-06 15:02
閱讀 3307·2021-09-04 16:45
閱讀 2484·2021-08-11 10:23
閱讀 3599·2021-07-26 23:38
閱讀 2900·2019-08-30 15:54