决胜春招(六)——那些你见过设计模式[持续更新]|技术点评

110 阅读2分钟

生产者与消费者模式

线程池

image.png

单纯的将生产者与消费者解耦并不是这个设计模式的精髓

设置这个缓冲区才是

  1. 解耦之后总要有个联系,低耦合并不是不耦合,所以缓冲区可以承载两者的需求
  2. 同步支持,由于函数调用是同步的(或者叫阻塞的),在消费者的方法没有返回之前,生产者只好一直等,缓冲区可解决这个问题,生产者会提前生产。可以通过双缓冲区,让生产者和消费者同时使用缓冲区
  3. 支持忙闲不均,生产者和消费者速度可能不一致,这样可以让多余的生产者,可以放在缓冲区里慢慢来

管道也有这个模式

优点 :

  1. 基本上所有操作系统都支持在shell方式下使用管道符。因此很容易实现跨平台

  2. 大部分编程语言都能够操作stdio,因此跨编程语言也就容易实现。

3.管道方式省却了线程安全方面的琐事[操作系统帮你安排了]。有利于降低开发、调试成本。

当然,这种方式也有自身的缺点:

  1. 生产者进程和消费者进程必须得在同一台主机上,无法跨机器通讯。这个缺点比较明显。

  2. 在一对一的情况下,这种方式挺合用。但如果要扩展到一对多或者多对一,那就有点棘手了。所以这种方式的扩展性要打个折扣。假如今后要考虑类似的扩展,这个缺点就比较明显。

  3. 由于管道是shell创建的,对于两边的进程不可见(程序看到的只是stdio)。在某些情况下,导致程序不便于对管道进行操纵(比如调整管道缓冲区尺寸)。这个缺点不太明显。

  4. 最后,这种方式只能单向传数据。好在大多数情况下,消费者进程不需要传数据给生产者进程。万一你确实需要信息反馈(从消费者到生产者),那就费劲了。可能得考虑换种IPC方式。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情