内容:
1.什么是生产者消费者模型
2.python实现生产者消费者模型
3.Java实现生产者消费者模型
参考:https://www.cnblogs.com/Eva-J/articles/8253549.html
1.什么是生产者消费者模型
(1)前言
随着软件业的发展,互联网用户的日渐增多,并发这门艺术的兴起似乎是那么合情合理。每日PV十多亿的淘宝,处理并发的手段可谓是业界一流。用户访问淘宝首页的平均等待时间只有区区几秒,但是服务器所处理的流程十分复杂
首先负责首页的服务器就有好几千台,通过计算把与用户路由最近的服务器处理首页的返回。其次是网页上的资源,就JS和CSS文件就有上百个,还有图片资源等。它能在几秒内加载出来可见阿里几千名顶尖工程师的智慧是如何登峰造极
在大型电商网站中,他们的服务或者应用解耦之后,是通过消息队列在彼此间通信的。消息队列和应用之间的架构关系就是生产者消费者模型
(2)生产者消费者模型
生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。生产消费者模式如下图:
在日益发展的服务类型中,譬如注册用户这种服务,它可能解耦成好几种独立的服务(账号验证,邮箱验证码,手机短信码等)。它们作为消费者,等待用户输入数据,在前台数据提交之后会经过分解并发送到各个服务所在的url,分发的那个角色就相当于生产者。消费者在获取数据时候有可能一次不能处理完,那么它们各自有一个请求队列,那就是内存缓冲区了。做这项工作的框架叫做消息队列
为什么要使用生产者和消费者模式:
在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。
在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。
同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式
(3)生产者消费者模型的简单伪代码
1 semaphore mutex=1; // 临界区互斥信号量 2 semaphore empty=n; // 空闲缓冲区 3 semaphore full=0; // 缓冲区初始化为空 4 producer () // 生产者进程 5 { 6 while(1) 7 { 8 produce an item in nextp; // 生产数据 9 P(empty); // 获取空缓冲区单元 10 P(mutex); // 进入临界区. 11 add nextp to buffer; // 将数据放入缓冲区 12 V(mutex); // 离开临界区,释放互斥信号量 13 V(full); // 满缓冲区数加1 14 } 15 } 16 17 consumer () // 消费者进程 18 { 19 while(1) 20 { 21 P(full); // 获取满缓冲区单元 22 P(mutex); // 进入临界区 23 remove an item from buffer; // 从缓冲区中取出数据 24 V (mutex); // 离开临界区,释放互斥信号量 25 V (empty) ; // 空缓冲区数加1 26 consume the item; // 消费数据 27 } 28 }
2.python实现生产者消费者模型
(1)用基本的队列实现
1 import time, random 2 from multiprocessing import Process, Queue 3 4 def producer(name, food, q): 5 for i in range(10): 6 time.sleep(random.randint(1, 3)) 7 f = "%s生产了%s%s" % (name, food, i+1) 8 print(f) 9 q.put(f) 10 11 def consumer(name, q): 12 while True: 13 food = q.get() 14 if food is None: 15 print("%s获取到了一个空" % name) 16 break 17 print("