什么是生产者?
食物链中能自己制造事物的生物叫生产者
什么是消费者?
直接消费或间接消费别的生物制造的食物的生物叫做消费者
为什么引入生产者与消费者模型?
在并发编程中,如果生产者处理速度很快,而消费者处理速度比较慢,那么生产者就必须等 待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那 么消费者就必须等待生产者。为了解决这个等待的问题,就引入了生产者与消费者模型。让 它们之间可以不停的生产和消费。
那什么是生产者消费者模式?
生产者与消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据,不需要等待消费者处理,直接扔给队列,消费者不找生产者要数据,而是直接从阻塞 队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
举个例子:
在餐厅中,如果你去消费,你作为一个消费者,点菜,只需要告诉前台,告诉服务员,你不用去厨房找厨师。客户的饭菜,也不是厨师直接给你,而是服务员给你端过来的。这个服务员或者前台就相当于队列,厨师就是生产者,客户就是消费者。

(一)当只有一个生产者一个消费者的时候:
代码示例:

from queue import Queue
from threading import Thread
import time

#创建队列
q=Queue(10)
def producer(name):
    count=1   #给生产的包子计数
    while True:
        q.join()  #等待task——done()发送信号
        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("消费者{}正在池第{}个包子".format(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个包子
 . . . .  . . . . . . . . 
'''

(2)一个生产者与多个消费者

from queue import Queue
from threading import Thread
import time

#创建队列
q=Queue(10)
def producer(name):
    count=1   #给生产的包子计数
    while True:
        q.join()  #等待task——done()发送信号
        q.put(count)
        print("%s正在生产第%d个包子"%(name,count))
        count+=1
        time.sleep(2)

def customer1(name):
    count=1
    while True:
        bao_zi=q.get()
        print("消费者1{}正在池第{}个包子".format(name,bao_zi))
        count+=1
        q.task_done()
        time.sleep(1)


def customer2(name):
    count = 1
    while True:
        bao_zi = q.get()
        print("消费者2{}正在池第{}个包子".format(name, bao_zi))
        count += 1
        q.task_done()
        time.sleep(1)


if __name__ == '__main__':
    t1= Thread(target=producer,args=("张三",))
    t2= Thread(target=customer1,args=("李四",))
    t3 = Thread(target=customer2, args=("小吴",))
    t1.start()
    t2.start()
    t3.start()

'''
运行结果:

张三正在生产第1个包子
消费者1李四正在池第1个包子
张三正在生产第2个包子
消费者2小吴正在池第2个包子
张三正在生产第3个包子消费者1李四正在池第3个包子

张三正在生产第4个包子
消费者2小吴正在池第4个包子
张三正在生产第5个包子
消费者1李四正在池第5个包子
张三正在生产第6个包子
消费者2小吴正在池第6个包子
张三正在生产第7个包子
消费者1李四正在池第7个包子
张三正在生产第8个包子消费者2小吴正在池第8个包子

张三正在生产第9个包子
消费者1李四正在池第9个包子
张三正在生产第10个包子消费者2小吴正在池第10个包子
'''

(3)多个生产者与多个消费者

import time
def consumer(name):
    '''
    这是一个生成器,调用的时候才执行
    :param name:消费者的名字
    :return:包子
    '''
    print("消费者准备吃包子-------")
    while True:
        new_baozi = yield #接受调用生成器的值
        print("%s吃第%d个包子"%(name,new_baozi))
        time.sleep(1)

def producer(name):
    r = con.__next__()
    r = con2.__next__()
    count=1
    while True:
        print("%s正在生产第%d个包子和第%d个包子"%(name,count,count+1))
        #调用生成器并且发送数据
        con.send(count)
        con2.send(count+1)
        count+=2

if __name__ == '__main__':
    con = consumer("张三")
    con2 = consumer("李四")
    p=producer("大厨")

'''
运行结果:

消费者准备吃包子-------
消费者准备吃包子-------
大厨正在生产第1个包子和第2个包子
张三吃第1个包子
李四吃第2个包子
大厨正在生产第3个包子和第4个包子
张三吃第3个包子
李四吃第4个包子
大厨正在生产第5个包子和第6个包子
张三吃第5个包子
李四吃第6个包子
大厨正在生产第7个包子和第8个包子
张三吃第7个包子
李四吃第8个包子
大厨正在生产第9个包子和第10个包子
张三吃第9个包子
李四吃第10个包子
大厨正在生产第11个包子和第12个包子
张三吃第11个包子

'''