本文介绍了并行循环步骤和其相关使用示例。

介绍

并行循环(Foreach)步骤遍历输入中的某个数组类型参数,对于数组中的每个元素并行执行其串行步骤。并行循环步骤类似于编程语言中的 foreach ,不同之处是这里的迭代是并行执行的。

并行循环步骤的每次迭代执行都对应一个本地变量。执行并行循环步骤会对输入参数里的每个元素并发执行串行步骤。这些串行步骤会改变其迭代对应的本地变量。当所有分支执行结束后,可以通过输出映射将迭代本地变量数组转换为并行步骤的输出。

说明 并行循环步骤最大并发数限制为 100。

并行步骤包含以下属性:

  • type(必需):foreach,表示该步骤是并行循环步骤。
  • name(必需):步骤名称。
  • iterationMapping(必需): 迭代映射。
    • collection(必需):定义输入中的哪个参数作为循环的集合。
    • item(必需):定义当前元素以什么名称并入迭代输入。
    • index(可选):定义当前位置以什么名称并入迭代输入。
  • steps(必需):定义串行步骤。
  • end(可选):当前步骤结束后是否继续执行其后定义的步骤。
  • inputMappings(可选):输入映射。
  • outputMappings(可选):输出映射。本步骤的 $local 是数组类型,其中的每个元素是一个 JSON 对象,记录了每次迭代的结果。
    说明 如果未指定输出映射,本步骤默认输出为空。

示例

下面的示例流程定义了一个并行循环步骤,这个并行步骤包含一个任务步骤。

version: v1
type: flow
steps:
  - type: foreach
    name: myforeach
    iterationMapping:
      collection: $.names
      item: name
    steps:
      - type: task
        name: toUpperCase
        resourceArn: acs:fc:{region}:{account}:services/fnf_test/functions/toUpperCase
    outputMappings:
      - target: names
        source: $local[*].name            
  • 流程的输入如下所示。由于 myforeach 步骤没有指定输入映射,其输入和流程输入一样。
    {
      "names": ["a", "b", "c"]
    }            
  • toUpperCase 没有定义输入映射,其输入继承父步骤输入,系统根据迭代映射 (iterationMapping)在每次执行迭代时,将当期元素(依次是 abc)为值,以 name 为 key 并入输入。
    {
      "name": "a",
      "names":["a","b","c"]
    }
    {
      "name": "b",
      "names":["a","b","c"]
    }
    {
      "name": "c",
      "names":["a","b","c"]
    }           
  • toUpperCase 被执行了 3 次,输出依次如下所示。
    {
      "name": "A"
    }
    {
      "name": "B"
    }
    {
      "name": "C"
    }            
  • myforeach 的本地变量是一个数组类型,值如下所示。
    [
      {
        "name": "A"
      },
      {
        "name": "B"
      },
      {
        "name": "C"
      }
    ]            
  • myforeach 的输出如下所示。由于流程没有定义输出和结果映射,这个输出也是最后流程执行的输出。
    {
      "names": ["A", "B", "C"]
    }