并发编程——进程——生产者消费者模型
生活随笔
收集整理的這篇文章主要介紹了
并发编程——进程——生产者消费者模型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、生產者消費者模型介紹
為什么要使用生產者消費者模型
生產者指的是生產數據的任務,消費者指的是處理數據的任務。
在并發編程中,如果生產者處理速度很快,而消費者處理速度很慢,那么生產者就必須等待消費者處理完,才能繼續生產數據。
同樣的道理,如果消費者的處理能力大于生產者,那么消費者就必須等待生產者。
為了解決這個問題于是引入了生產者和消費者模式。
什么是生產者和消費者模式
生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題。
生產者和消費者彼此之間不直接通訊,而通過阻塞隊列來進行通訊,所以生產者生產完數據之后不用等待消費者處理,直接扔給阻塞隊列,消費者不找生產者要數據,而是直接從阻塞隊列里取,阻塞隊列就相當于一個緩沖區,平衡了生產者和消費者的處理能力。
這個阻塞隊列就是用來給生產者和消費者解耦的。
二、生產者消費者模型實現
import time import random from multiprocessing import Process from multiprocessing import JoinableQueuedef consumer(q, name):while True:time.sleep(random.randint(1, 3))print(name, "eat", q.get())q.task_done() # 發送信號給q.join()說明已經從隊列中取走一個數據并處理完畢了def producer(q, name, food):for i in range(3):time.sleep(random.randint(2, 5))result = "%s %s" % (food, i)q.put(result)print(name, "creat", result)q.join() # 等到消費者把自己放入隊列中的所有的數據都取走之后,生產者才結束if __name__ == '__main__':queue = JoinableQueue()producer1 = Process(target=producer, args=(queue, "producer 1", "紅燒肉"))producer1.start()producer2 = Process(target=producer, args=(queue, "producer 2", "黃燜雞"))producer2.start()producer3 = Process(target=producer, args=(queue, "producer 3", "鐵板燒"))producer3.start()consumer1 = Process(target=consumer, args=(queue, "Alex"))consumer1.daemon = Trueconsumer1.start()consumer2 = Process(target=consumer, args=(queue, "Coco"))consumer2.daemon = Trueconsumer2.start()producer1.join()producer2.join()producer3.join()輸出結果為:
producer 3 creat 鐵板燒 0 Coco eat 鐵板燒 0 producer 1 creat 紅燒肉 0 Alex eat 紅燒肉 0 producer 2 creat 黃燜雞 0 producer 3 creat 鐵板燒 1 Coco eat 黃燜雞 0 producer 1 creat 紅燒肉 1 producer 2 creat 黃燜雞 1 Alex eat 鐵板燒 1 producer 3 creat 鐵板燒 2 Coco eat 黃燜雞 1 Alex eat 紅燒肉 1 Coco eat 鐵板燒 2 producer 1 creat 紅燒肉 2 Coco eat 紅燒肉 2 producer 2 creat 黃燜雞 2 Alex eat 黃燜雞 2總結
以上是生活随笔為你收集整理的并发编程——进程——生产者消费者模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并发编程——进程——进程的同步与数据共享
- 下一篇: BEGIN-1 A+B问题