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