生产者&消费者模型

在并发编程中,如果生产者处理速度很快,而消费者处理速度比较慢,那么生产者就必须等
待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那
么消费者就必须等待生产者。为了解决这个等待的问题,就引入了生产者与消费者模型。让
它们之间可以不停的生产和消费

举例:
在一个包子铺,师傅做包子(生产者),客人吃包子(消费者),但是呢后厨与餐厅之间是通过服务员来做中间工作,所以他们不接触,生产者只管做好包子放在固定地方,有客人来吃完就继续做。:生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

from queue import Queue #队列 (包子暂存地)
from threading import Thread  #线程(同时进行)
import time 
q = Queue(10) #(一次存放十个包子)
def producer(name):
    count = 1 #给生产计数
    while True:
        q.join() 
        q.put(count) #收信号(没包子或者包子被吃了,开始做包子)
        print('%s正在生产第%d个包子'%(name,count))
        count += 1
        time.sleep(2) #两秒做
def customer(name):
    count = 1
    while True:
        bao_zi = q.get()
        print('消费者%s正在吃第%d个包子'%(name,bao_zi))
        count += 1
        q.task_done()
        time.sleep(1) #一秒吃
if __name__ == '__main__':
    t1 = Thread(target=producer,args=('王大厨',))
    t2 = Thread(target=customer,args=('李小馒',))
    t1.start()
    t2.start()

#结果:
王大厨正在生产第1个包子
消费者李小馒正在吃第1个包子
王大厨正在生产第2个包子消费者李小馒正在吃第2个包子

王大厨正在生产第3个包子消费者李小馒正在吃第3个包子

王大厨正在生产第4个包子
消费者李小馒正在吃第4个包子
王大厨正在生产第5个包子
消费者李小馒正在吃第5个包子
王大厨正在生产第6个包子
消费者李小馒正在吃第6个包子
王大厨正在生产第7个包子
消费者李小馒正在吃第7个包子
王大厨正在生产第8个包子消费者李小馒正在吃第8个包子

王大厨正在生产第9个包子
消费者李小馒正在吃第9个包子
王大厨正在生产第10个包子消费者李小馒正在吃第10个包子

王大厨正在生产第11个包子
消费者李小馒正在吃第11个包子
王大厨正在生产第12个包子
消费者李小馒正在吃第12个包子
王大厨正在生产第13个包子消费者李小馒正在吃第13个包子

王大厨正在生产第14个包子消费者李小馒正在吃第14个包子

q.join():生产者负责接收信号
q.task_done():消费者发送吃完了信号
从结果来看生产者和消费者有序的进行着,不会造成混乱。

posted @ 2020-02-13 18:26  afly_8  阅读(64)  评论(0编辑  收藏  举报