生产者与消费者模式(理解)

摘要:
生产者/消费者模式:需要同步和线程,属于从多个分布式列生成数据的模块,形象地称为生产者;处理数据的模块称为使用者。仅仅抽象生产者和消费者不足以成为生产者/消费者模型。生产者将数据放入缓冲区,而消费者将数据从缓冲区中取出。当生产商的生产速度放缓时,消费者将慢慢应对。

生产者/消费者模式:需要使用到同步,以及线程,属于多并发行列

产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。 

单单抽象出生产者和消费者,还够不上是生产者/消费者模式。该模式还需要有一个缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从缓冲区取出数据。

解耦:

假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。将来如果消费者的代码发生变化,可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了。

支持并发:

生产者直接调用消费者的某个方法,还有另一个弊端。由于函数调用是同步的(或者叫阻塞的),在消费者的方法没有返回之前,生产者只好一直等在那边。万一消费者处理数据很慢,生产者就会白白糟蹋大好时光。
使用了生产者/消费者模式之后,生产者和消费者可以是两个独立的并发主体(常见并发类型有进程和线程两种)。生产者把制造出来的数据往缓冲区一丢,就可以再去生产下一个数据。基本上不用依赖消费者的处理速度。其实当初这个模式,主要就是用来处理并发问题的。

支持忙闲不均:

缓冲区还有另一个好处。如果制造数据的速度时快时慢,缓冲区的好处就体现出来了。当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来,消费者再慢慢处理掉。

环形缓冲区(减少了内存分配的开销)

双缓冲区(减少了同步/互斥的开销)

消费者:

生产者与消费者模式(理解)第1张

生产者:

生产者与消费者模式(理解)第2张

缓冲区:

生产者与消费者模式(理解)第3张

生产者与消费者模式(理解)第4张

免责声明:文章转载自《生产者与消费者模式(理解)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PHP文件上传至另一台服务器JSP,servlet和数据库之间传值出现乱码的问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

进程间通信 Queue队列使用 生产者消费者模型 线程理论 创建及对象属性方法 线程互斥锁 守护线程

进程补充 进程通信 要想实现进程间通信,可以用管道或者队列 队列比管道更好用(队列自带管道和锁) 管道和队列的共同特点:数据只有一份,取完就没了 无法重复获取用一份数据 队列特点:先进先出 堆栈特点:先进后出 我们采用队列来实现进程间数据通信,下面先介绍一下队列 Queue队列的基本使用 基本方法:q.put(元素) q.get() q.get_nowai...

rabbitmq、kafka、activemq、rocketmq之间对比,区别

rabbitmq、kafka、activemq、rocketmq之间对比,区别 支持原创  转自 https://www.cnblogs.com/williamjie/p/9481780.html 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑。再不然...

C语言之生产者与消费者模型

多线程并发应用程序有一个经典的模型,即生产者/消费者模型。系统中,产生消息的是生产者,处理消息的是消费者,消费者和生产者通过一个缓冲区进行消息传递。生产者产生消息后提交到缓冲区,然后通知消费者可以从中取出消息进行处理。消费者处理完信息后,通知生产者可以继续提供消息。 要实现这个模型,关键在于消费者和生产者这两个线程进行同步。也就是说:只有缓冲区中有消息时,...

LMAX Disruptor—多生产者多消费者中,消息复制分发的高性能实现

解决的问题 当我们有多个消息的生产者线程,一个消费者线程时,他们之间如何进行高并发、线程安全的协调? 很简单,用一个队列。 当我们有多个消息的生产者线程,多个消费者线程,并且每一条消息需要被所有的消费者都消费一次(这就不是一般队列,只消费一次的语义了),该怎么做? 这时仍然需要一个队列。但是: 1. 每个消费者需要自己维护一个指针,知道自己消费了队列中多少...

多线程详解,一篇文章彻底搞懂多线程中各个难点

出自https://mp.weixin.qq.com/s/xh-LfrelAgFCRkP5-s-GLw 1.什么是线程? linux内核中是没有线程这个概念的,而是轻量级进程的概念:LWP。一般我们所说的线程概念是C库当中的概念。 1.1线程是怎样描述的? 线程实际上也是一个task_struct,工作线程拷贝主线程的task_struct,然后共用主线程...

rabbitmq进阶

目录 消息传递 过期时间(TTL) 死信队列 延迟队列 优先级队列 RPC实现 持久化 生产者确认 消费端要点 消息传输保障 消息传递 mandatory mandatory=true,如果交换器无法根据自身的类型和路由键找到一个符合条件的队列,RabbitMQ会调用 Basic.Return 命令将消息返回给生产者,生产者通过调用 chann...