Wetts's blog

Stay Hungry, Stay Foolish.

0%

Java多线程编程实战指南-第13章-Pipeline(流水线)模式

读书笔记 - Java 多线程编程实战指南


第十三章 Pipeline(流水线)模式

模式介绍

  • Pipeline 模式的核心思想是将一个任务处理分解为若干个处理阶段(Stage),其中每个处理阶段的输出作为下一个处理阶段的输入,并且各个处理阶段都有相应的工作者线程去执行相应的计算。因此,处理一批任务时,各个任务的各个处理阶段是并行(Parallel)的。通过并行计算,Pipeline 模式使应用程序能够充分利用多核 CPU 资源,提高其计算效率。
  • 假设有一批任务(T1、T2、T3、T4),其中每个任务的处理可分解为 3 个处理阶段。虽然,对于这一批任务中的某一个任务而言,其处理仍然是串行的,即完成一个任务的处理要一次执行各个处理阶段,但从整体任务上看,各个处理阶段的执行是并行的。比如,处理阶段 1 的工作者线程执行完任务 T1 相应的计算后,其处理结果会被提交给处理阶段 2 作为输入;当处理阶段 2 的工作者线程正在执行任务 T1 的相应的计算时,处理阶段 1 正在执行任务 T2 相应的计算,此时这两个处理阶段时并行的。

-

模式架构

  • pipeline 模式将任务的处理分解为若干个处理阶段,并将其中的每个阶段抽象为一个对象。这些表示处理阶段的对象都有其工作者线程负责对输入进行处理,并将输出作为下一个处理阶段的输入。
  • 按照处理阶段中是否包含并发处理阶段,Pipeline 模式可分为线性 Pipeline 和非线性 Pipeline 两种。

-

实战案例

某系统需要一个数据同步的定时任务。该定时任务将数据库中符合指定条件的记录数据以文件的形式 FTP 传输(同步)到指定的主机上。该定时任务需要满足以下几个要求。

  1. 每个数据文件最多只包含 N(如 10000,具体可配置)条记录;当一个数据文件被写满时,其他待写记录会被写入新的数据文件。
  2. 每个数据文件可能需要被传输到多台主机上。
  3. 本地要保留同步过的数据文件的备份。

因此,该定时任务所要做的事情主要包括:查询数据库(以下称为 Stage1)、根据数据库查询结果集生成本地数据文件(以下称为 Stage2)、FTP 传输各个数据文件到指定的主机(支持多台主机,以下称为 Stage3)、备份传输完毕(或者失败)的数据文件(以下称为 Stage4)。显然,该任务处理涉及比较多的 I/O 操作:查询数据库和传输数据文件均涉及网络 I/O 和文件 I/O,备份传输过的文件涉及文件 I/O。所以,该任务的处理逻辑不适宜用单线程实现。因为采用单线程模式上述处理步骤只能是按顺序串行执行,而这会使各个处理步骤所涉及的 I/O 等待的负面影响方法。另外,如果采用多个线程,每个线程中仍然是按顺序串行处理(每个线程先后执行 Stage2、Stage3 和 Stage4)也是不适合的,这样会导致执行 Stage2 时多个线程需要征用同一个数据文件(因为这个文件还没有被写满)。
这里,Pipeline 模式可以派上用场:采用一个线程去负责 Stage1 的执行。其余处理步骤(Stage2、Stage3 和 Stage4)中的每一个步骤都有专门的工作者线程去负责处理。这样,从个体任务上看,上述处理步骤虽然仍然时按顺序串行处理,但从整体任务上看几个步骤却是并行的,从而提升了计算效率。

本案例 Demo 详见 multithreading 工程的 com.Pipeline 包

-

Pipeline 模式的评价与实现考量

-

Java 标准库实例

Java 标准库中没有使用 Pipeline 模式