admin 管理员组

文章数量: 1086019


2024年3月13日发(作者:switch菜单语句编写)

架构设计:生产者/消费者模式

为了方便阅读,把本系列帖子的目录整理如下:

0、概述

1、如何确定数据单元

2、队列缓冲区

3、环形缓冲区

4、双缓冲区

[0]:概述

今天打算来介绍一下“生产者/消费者模式”,这玩意儿在很多开发领域都能派上用

场。由于该模式很重要,打算分几个帖子来介绍。今天这个帖子先来扫盲一把。如果你对

这个模式已经比较了解,请跳过本扫盲帖,直接看下一个帖子(关于该模式的具体应用)。

看到这里,可能有同学心中犯嘀咕了:在四人帮(GOF)的23种模式里面似乎没听

说过这种嘛!其实GOF那经典的23种模式主要是基于OO的(从书名《Design Patterns:

Elements of Reusable Object-Oriented Software》就可以看出来)。而Pattern实际上

即可以是OO的Pattern,也可以是非OO的Pattern的。

★简介

言归正传!在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,

这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程

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

单单抽象出生产者和消费者,还够不上是生产者/消费者模式。该模式还需要有一个

缓冲区处于生产者和消费者之间,作为一个中介。生产者把数据放入缓冲区,而消费者从

缓冲区取出数据。大概的结构如下图。

为了不至于太抽象,我们举一个寄信的例子(虽说这年头寄信已经不时兴,但这个例

子还是比较贴切的)。假设你要寄一封平信,大致过程如下:

1、你把信写好——相当于生产者制造数据

2、你把信放入邮筒——相当于生产者把数据放入缓冲区

3、邮递员把信从邮筒取出——相当于消费者把数据取出缓冲区

4、邮递员把信拿去邮局做相应的处理——相当于消费者处理数据

★优点

可能有同学会问了:这个缓冲区有什么用捏?为什么不让生产者直接调用消费者的某

个函数,直接把数据传递过去?搞出这么一个缓冲区作甚?


本文标签: 数据 生产者 消费者 模式