1. 任务依赖需求描述:
例子:
一个作业分为如下子任务:
任务1,任务2,任务3,任务4
执行的顺序为,任务1---》任务2,任务3---》任务4
其中任务2,任务3可以并行执行,我们用下图描述:
这是一个图形结构,我们预设,任务的起始点永远都是一个根节点,不管你业务如何,遵从这个设计是没有难度的,以后的流程,可以并行,也可以串行,任何一个阶段,都能支持并行和串行,因此,我们的子任务关系构成的数据结构为一个图。
2. 任务调度简单流程
- 首先定义一个job代表一次业务的调度,job维护了任务1到任务4之间的关系。
- 找到job的根节点任务1,先执行任务1,因为是根节点,没有父类,因此没有先决条件,任务被调度时,即可执行。
- 执行完根节点之后,看该节点是否有子节点,没有则不继续,有则并行执行所有子节点的任务。
- 此时任务2和任务3会被并行调用,我们假设调用指令先到任务2,任务2发现有1个父节点,且调用指令中表示父节点已经执行完成,那么就开始执行任务2的调度,同理任务3也是同样的逻辑。
- 任务2和任务3执行完成之后,会先后或者同时调用任务4,我们这里为了避免同时并发造成的困扰,任务被调用这个方法要设置成同步,那么假设任务2先调用任务4,此时我们在内存中记录任务2已完成,并且任务4发现自己的2个父节点中,任务3的指令并没有来到,因此,此次调度跳过,等待任务3指令的到来。
- 当任务3的指令到来,我们根据jobid,找到之前暂停的job,此时发现任务2,3都执行完成,那么开始执行任务4&