2.1.6 包工头内部批量多阶段处理模式

通过上一节,我们了解到包工头之间的链式多环节处理,但是由于多个包工头通常是由多个类角色实现的,代表不同的调度角色和任务,那么这是一种粗粒度的环节划分,是否在一个包工头里面也是可以进行细粒度的划分呢?

Fourinone框架提供了包工头内部的批量处理,批量处理就是由多个工人完成各自的任务,必须等到最慢的一个工人做完,才统一返回结果。我们可看到批量处理doTaskBatch方法的定义(详见框架源码):

  1. WareHouse[] doTaskBatch(WorkerLocal[] wks, WareHouse wh)

输入参数:WorkerLocal[]是集群工人集合,WareHouse是任务。

输出参数:WareHouse[]是工人计算结果集合。

doTaskBatch方法的含义也就是让WorkerLocal[]中每个工人执行WareHouse任务,然后返回一个结果集WareHouse[],其序号对应WorkerLocal[],代表每个工人的完成结果。

doTaskBatch是一个堵塞方法,直到WorkerLocal[]中所有工人计算完成,才返回最后的结果集。

因此,在包工头内部的逻辑设计中,我们可以通过多个doTaskBatch批量处理,将giveTask划分为多个细粒度的阶段处理,比如多个步骤。如图2-7所示。

2.1.6 包工头内部批量多阶段处理模式 - 图1

图2-7 内部批量多阶段处理模式

所以,现在我们通过包工头的链式处理和内部的批量处理,可以粗粒度或细粒度地设计并行计算过程中的环节和阶段划分,这样能更灵活地满足不同层面的计算过程划分需求。在下面的章节中我们还会谈到业界的BSP等并行计算方式,其核心思想也就是对计算过程环节划分的功能支持,但是没有粗细粒度的考虑。