全部产品
Search
文档中心

云工作流:并行循环步骤

更新时间:Oct 30, 2023

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

介绍

并行循环(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"]
    }