控制策略
通过作业定义,完成了在模块代码中作业的描述。接下来,我们需要设计怎么去调用这些作业,即需要在模块代码中设计各种所需的调度控制策略。只有通过灵活设计各种调度策略,才能完成各种复杂多样的调度控制。
结构化控制
TASKCTL结构化控制策略主要借鉴了传统应用程序开发的一些结构化思想, 它不仅使流程设计更简单,也更灵活多变。同时,该结构化理念也充分体现了 TASKCTL 流程设计有别与传统调度流程设计的表单配置理念。
串并结构
串并结构控制是 TASKCTL流程控制主要控制策略,同时串并结构也是其它很多功能应用设计的基础,与其它特征应用结合使用会发挥更有效的功能
serial -串行
串行组节点通过 serial 表示,表示在串行组内,所有子节点都依次执行。以下是一个串行设计:
上图中,在串行组节点 g_serial1 下分别定义了名称为 shjob、dsjob、pyjob 三个不同种类的作业,三个作业是相互依赖的关系,即它们的运行关系是串行依次执行的关系。
parallel-并行
并行组节点通过 parallel 表示,表示在并行组内,所有子节点相互之间不存在运行先后关系,都可同时执行。以下是一个并行设计: 上图中,在并行组节点 g_parallel 下分别定义了名称为 shjob2、dsjob2、pyjob2 三个不同种类的作业,三个作业是不存在相互依赖的关系,它们均可同时运行。
串并嵌套
在实际应用中,简单的串并是无法满足复杂作业依赖关系,只有灵活应用串并嵌套才可能完成。由于排版原因,我们以下以示意图方式对嵌套进行讲解:一个简单的串并嵌套示意图如下:
上图是相关代码示意图,描述了在 G_serial1 串行节点内依次定义作业节点 job1、并行节点 G_parallel1、并行节点 G_parallel2 以及 job6,同时,在并行节点 G_parallel1 与 G_parallel2 下分别定义作业节点 job2、job3 与 job4、job5。
该示意图实际运行关系如下图所示:
在实际应用中,不论串并节点数还是嵌套深度都远比以上复杂。对于复杂的应用在此不作一一描述,具体需要用户在实际应用中慢慢体会与理解。
循环结构
循环指一个作业可以依次成功运行用户设计的次数。它主要通过作业 cycleinterval 属性来确定,该值缺省是 1,表示只能成功运行 1 次,即无循环。
以下是一个作业的循环设计:(语法有误)——cycle 属性,语法变更为 cycleinterval
以上设计表示 pyjob2 作业需要成功运行 10 次才表示该作业调度完成。一般情况,循环使用会涉及到缺省参数 cycleinterval 的应用,每次运行该值都会随着成功次数的改变而改变。
该值从 1 开始,成功一次后,该值变为 2,以此类推。通过 cycle 参数带入实际程序中,让实际程序根据 cycleinterval 值做实际意义的循环处理。
如果要对一个作业流分支进行循环控制,v7.0 版本可以通过把作业流分支组织为 include 模块节点。然后在 include 节点上应用 cyclecount 循环次数和 cyclebreak 循环中断条件来控制。
条件分支结构
条件分支功能首先是建立在串并组节点基础之上,一个分支表示一个串并组, 同时,条件分支需要借助节点 condition 属性来协同完成。对于 condition 属性, 是一个相对复杂的属性,大家通过以上描述可以充分理解什么是 TASKCTL 条件分支。
以下,我们通过一段代码来认识条件分支:
上图中,在一个大串行组下分别定义一个作业 mydeal 以及 mydeal1 与 mydeal2 两个分支组。如果按串并规则,会先运行 mydeal 作业,再运行 mydeal1 串行组, 最后运行 mydeal2 并行组,但由于我们分别在 mydeal1 分支组以及 mydeal2 分支组节点设置了 condition 属性,实际运行就会改变这种简单串行控制策略,这种改变体现在:mydeal1 分支只能在 mydeal 作业运行结果为 40 时运行,而 mydeal2 分支只能在 mydeal 作业运行结果为 41 时运行。