生产者-消费者模式

article/2025/9/29 8:16:05

概述


生产者-消费者模式在系统交互方面,有几个特点:
1、系统解耦
2、解决并发问题
3、不需要关心对方系统何时处理数据,处理结果如何

下面用几个简单例子逐步说明。


简单例子


假设有两个系统,A系统和B系统,B系统需要依赖A系统产生的数据,也就是说,A系统产生数据后,必须把数据扔给B系统。
这个时候,可以让B系统提供一个方法,比如说提供一个http接口sendData(),然后A系统直接调用即可。

这里写图片描述

这种方案在流量不大的情况下,完全没问题的,但是如果系统并发量大的情况下,每次A系统同步调用B系统的sendData()接口时,就会被阻塞住,如果sendData方法处理的很慢,那么会直接影响A系统的吞吐量的。
因此最好能异步的调用B系统的接口,然后A系统可以立刻返回,继续处理其他事情。

可以直接使用JAVA的线程池技术,new一个线程调用B系统的接口,达到异步调用的目的。
这里写图片描述

这样的话,A系统就只管发送数据了,无需理会B系统接口的处理速度如何,也不会被B系统的接口阻塞住。但是此时还是有两个问题:
1、B系统此时需要做一些应付大并发量的处理,因为面对A系统的狂轰滥炸,B系统可能处理不过来的。
2、A系统和B系统还是耦合了。因为A系统还是直接调用B系统接口,直接交互的。

有没有更好的方案,双方既能处理并发,同时两个系统之间又无需耦合呢?答案是使用生产者-消费者模式


生产者-消费者模式


生产者-消费者模式通过引入一个阻塞队列这个第三方组件来做到解耦和处理并发。
生产者只需要往队列里面塞数据,消费者只需要从队列中读取数据,生产者再也无需关注消费者处理数据的速度是如何了。生产者和消费者已经是完全独立的了。
利用某些队列特性,当生产者速度太快的话,数据超过了队列的最大阀值,那么可以自动阻塞住生产者(当然也可以设置线程阻塞的超时时间,防止消费者挂掉了,一直不处理队列中的数据,生产者),一直等到消费者先消费一些数据。

这里写图片描述


进一步思考


之前写过一篇ThreadPoolExecutor简单介绍介绍了JAVA线程池的一些基本用法,ThreadPoolExecutor也利用了生产者-消费者模式的思想,只不过
ThreadPoolExecutor是有必要的时候才使用队列,性能是比上面的直接使用队列的方式性能要高很多的。实际操作中也可以借鉴这种做法。


参考的文章


1、聊聊并发——生产者消费者模式


http://chatgpt.dhexx.cn/article/nv3X6LJa.shtml

相关文章

生产者消费者模式及简单的运用场景

先考虑一个问题:服务端接受多个客户端提交的视频文件进行转码的操作,应该怎么设计? 由于转码比较花费时间,所以我们排除同步的想法。而转码需要用到的外部软件(exe文件),不能同时被多个线程用到…

Java多线程系列—生产者消费者模式的多种实现(04)

生产者消费者模式 我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦、消息队列等场景。 在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者,有时生产者的生产速度特别快,但消费者的消…

生产者消费者模式的Java实现

一.概述 1. 什么是“生产者消费者模式”? 生产线程负责生产,消费线程负责消费 生产线程和消费线程要达到均衡。 生产满了就不能继续生产了,必须让消费线程进行消费 消费完了就不能再消费了,必须让生产线程进行生产 这是一种特殊的…

实现生产者消费者模式的三种方式

什么是生产者消费者模式 简单来说,生产者消费者模式就是缓冲区。 那么这么做有两个好处,一个是解耦,第二个是平衡生产能力和消费能力的差,因为生产者和消费者的速度是不一样的,有了这个缓冲区就可以平衡这样一个落差&…

生产者消费者模式最佳实践

测试环境:ubuntu18.04opencv4.2Qt 一个生产者-消费者模式下的视频处理框架。基础结构:视频读取类线程不断读取视频帧,处理类线程对图像进行处理,之后通过信号与槽机制在主线程中显示。特点:视频读取、处理为独立线程&a…

生产者、消费者模式

架构设计:生产者/消费者模式[0]:概述 今天打算来介绍一下“生产者/消费者模式”,这玩意儿在很多开发领域都能派上用场。由于该模式很重要,打算分几个帖子来介绍。今天这个帖子先来扫盲一 把。如果你对这个模式已经比较…

生产者和消费者模式详解

★简介 生产者消费者模式并不是GOF提出的23种设计模式之一,23种设计模式都是建立在面向对象的基础之上的,但其实面向过程的编程中也有很多高效的编程模式,生产者消费者模式便是其中之一,它是我们编程过程中最常用的一种设计模式。…

生产者消费者模式+代码实现

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在…

生产者消费者模式详解(转载)

★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生…

多线程之生产者消费者模式

文章目录 基本组成阻塞队列有界队列与无界队列ArrayBlockingQueueLinkedBlockingQueueSynchronousQueue 流量控制与信号量(Semaphore)双缓冲与Exchanger 基本组成 生产者:生产者的任务是生产产品,产品可以是数据,也可以是任务。(将产品存入传…

java 生产者消费者模式

java的生产者消费者模式,有三个部分组成,一个是生产者,一个是消费者,一个是缓存。 这么做有什么好处呢? 1.解耦(去依赖),如果是消费者直接调用生产者,那如果生产者的代码变动了,消费…

生产者消费者模式浅析

由于最近工作中,涉及到生产者消费者设计模式,对此有一些体会,所以总结一下,与大家分享。 什么是生产者消费者模式 在工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个…

java实现生产者消费者模式

一: 什么是生产者消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费…

【Java】生产者消费者模式的实现

前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来…

生产者/消费者模式

[0]:概述 今天打算来介绍一下“生产者/消费者模式”,这玩意儿在很多开发领域都能派上用场。由于该模式很重要,打算分几个帖子来介绍。今天这个帖子先来扫盲一把。如果你对这个模式已经比较了解,请跳过本扫盲帖&#x…

(四)生产者消费者模式

(一)生产者消费者模式原理: 在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。生产消费者模式如下图: (二…

【C++】【设计模式之】生产者-消费者模型(理论讲解及实现)

一、什么是生产者-消费者模型 1、简单理解生产者-消费者模型 假设有两个进程(或线程)A、B和一个固定大小的缓冲区,A进程生产数据放入缓冲区,B进程从缓冲区中取出数据进行计算,这就是一个简单的生产者-消费者模型。这里…

设计模式——生产者消费者模式

1 基本概括 2 主要介绍 2.1 概念 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列&#xff…

生产者消费者模式三种实现方式

目录 1.什么是生产者消费者模式:2.生产者消费者模型的实现:第一种:使用 synchronized和wait、notify第二种:使用 Lock和await、signal第三种:使用 阻塞队列 BlockingQueue 1.什么是生产者消费者模式: 生产…

t-SNE算法

t-SNE(t-distributed stochastic neighbor embedding)是用于降维的一种机器学习算法,是由 Laurens van der Maaten 和 Geoffrey Hinton在 08 年提出来。t-SNE 是一种非线性降维算法,非常适用于高维数据降维到 2 维或者 3 维,进行可视化。在实…