

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Parallel 工作流程状态
<a name="state-parallel"></a>

**管理状态和转换数据**  
了解有关[使用变量在状态之间传递数据](workflow-variables.md)和[使用转换数据](transforming-data.md)的信息 JSONata。

`Parallel` 状态 (`"Type": "Parallel"`) 可用于在状态机中添加单独的执行分支。

除了[常用状态字段](statemachine-structure.md#amazon-states-language-common-fields)之外，`Parallel` 状态还包括这些额外字段。

** `Branches`（必填）**  
一个对象数组，指定要并行执行的状态机。每个此类状态机对象都必须具有名为 `States` 和 `StartAt` 的字段，其含义与在状态机顶级中的字段完全相同。

**`Parameters`（ JSONPath 仅限可选）**  
用于将信息传递给 `Branches` 数组中定义的状态机。

**`Arguments`（ JSONata 仅限可选）**  
用于将信息传递给所连接资源的 API 操作。值可以包括 JSONata 表达式。有关更多信息，请参阅 [在 Step Functi JSONata ons 中使用转换数据](transforming-data.md)。

**`Output`（ JSONata 仅限可选）**  
用于指定和转换状态的输出。指定后，该值将覆盖状态输出默认值。  
输出字段接受任何 JSON 值（对象、数组、字符串、数字、布尔值、null）。任何字符串值，包括对象或数组内部的字符串值，都将被计算为 JSONata 被 \$1%%\$1 个字符包围。  
 输出也直接接受 JSONata 表达式，例如：“输出”：“\$1% jsonata expression%\$1”   
有关更多信息，请参阅[在 Step Functi JSONata ons 中使用转换数据](transforming-data.md)。

** `Assign`（可选）**  
用于存储变量。该`Assign`字段接受一个 JSON 对象，该对象包含定义变量名及其分配值的 key/value 对。任何字符串值，包括对象或数组内部的值，都将按照被`{% %}`字符包围 JSONata 时的计算方式进行计算  
有关更多信息，请参阅 [使用变量在状态之间传递数据](workflow-variables.md)。

** `ResultPath`（ JSONPath 仅限可选）**  
指定 (输入中) 用于放置分支输出的位置。接下来，输入将按照 `OutputPath` 字段（如果存在）指定的内容进行筛选，然后再用作状态输出。有关更多信息，请参阅[输入和输出处理](concepts-input-output-filtering.md)。

** `ResultSelector`（ JSONPath 仅限可选）**  
传递键值对集合，其中，值为静态值或从结果中选择的值。有关更多信息，请参阅[ResultSelector](input-output-inputpath-params.md#input-output-resultselector)。

** `Retry`（可选）**  
一个称为重试器的对象的数组，定义在状态遇到运行时错误的情况下的重试策略。有关更多信息，请参阅[使用 Retry 和 Catch 的状态机示例](concepts-error-handling.md#error-handling-examples)。

** `Catch`（可选）**  
一个称为捕获器的对象数组，定义在状态遇到运行时错误并且其重试策略已耗尽或者未定义的情况下执行的回退状态。有关更多信息，请参阅[回退状态](concepts-error-handling.md#error-handling-fallback-states)。

`Parallel`状态会 AWS Step Functions 导致尽可能并发地执行每个分支，从该分支的`StartAt`字段中命名的状态开始，然后等到所有分支终止（达到终端状态）后再处理该`Parallel`状态的`Next`字段。

## 并行状态示例
<a name="parallel-example"></a>

```
{
  "Comment": "Parallel Example.",
  "StartAt": "LookupCustomerInfo",
  "States": {
    "LookupCustomerInfo": {
      "Type": "Parallel",
      "End": true,
      "Branches": [
        {
         "StartAt": "LookupAddress",
         "States": {
           "LookupAddress": {
             "Type": "Task",
             "Resource": "arn:aws:lambda:region:account-id:function:AddressFinder",
             "End": true
           }
         }
       },
       {
         "StartAt": "LookupPhone",
         "States": {
           "LookupPhone": {
             "Type": "Task",
             "Resource": "arn:aws:lambda:region:account-id:function:PhoneFinder",
             "End": true
           }
         }
       }
      ]
    }
  }
}
```

在本示例中，`LookupAddress` 和 `LookupPhone` 分支并行执行。以下是可视工作流在 Step Functions 控制台中的显示效果。

![\[示例 Parallel 工作流程的可视化图表。\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/parallel-state.png)


每个分支必须是自包含的。对于 `Parallel` 状态的一个分支中的状态，不能具有将该分支之外的字段作为目标的 `Next` 字段，该分支之外的任何其他状态也不能转换到该分支中。

## 并行状态输入和输出处理
<a name="state-parallel-output"></a>

`Parallel` 状态向每个分支提供其自己输入数据的副本 (需要由 `InputPath` 字段修改)。它会生成一个数组输出，在该数组中每个分支有一个元素，包含来自该分支的输出。不要求所有元素具有相同类型。输出数组可以按照常规方法，使用 `ResultPath` 字段插入到输入数据（并且整体作为 `Parallel` 状态的输出发送）（请参阅[输入和输出处理](concepts-input-output-filtering.md)）。

```
{
  "Comment": "Parallel Example.",
  "StartAt": "FunWithMath",
  "States": {
    "FunWithMath": {
      "Type": "Parallel",
      "End": true,
      "Branches": [
        {
          "StartAt": "Add",
          "States": {
            "Add": {
              "Type": "Task",
              "Resource": "arn:aws:states:region:123456789012:activity:Add",
              "End": true
            }
          }
        },
        {
          "StartAt": "Subtract",
          "States": {
            "Subtract": {
              "Type": "Task",
              "Resource": "arn:aws:states:region:123456789012:activity:Subtract",
              "End": true
            }
          }
        }
      ]
    }
  }
}
```

如果向 `FunWithMath` 状态提供了数组 `[3, 2]` 作为输入，则 `Add` 和 `Subtract` 状态均接收该数组作为输入。`Add` 和 `Subtract` 任务的输出将是数组元素 3 和 2 的和与差，即 `5` 和 `1`，而 `Parallel` 状态的输出将是一个数组。

```
[ 5, 1 ]
```

**提示**  
如果您在状态机中使用的 Parallel 或 Map 状态返回由数组组成的数组，您可以使用 [ResultSelector](input-output-inputpath-params.md#input-output-resultselector) 字段将他们转换为一个平面数组。有关更多信息，请参阅 [展平由数组组成的数组](input-output-inputpath-params.md#flatten-array-of-arrays-result-selector)。

## 错误处理
<a name="error-handling"></a>

如果任何分支由于未处理的错误或者转换为 `Fail` 状态而失败，则整个 `Parallel` 状态将视为已失败，并且会停止所有其分支。如果 `Parallel` 状态本身不处理错误，Step Functions 将停止执行，并出现错误。

**注意**  
当 Parallel 状态失败后，调用的 Lambda 函数将继续运行并且处理任务令牌的活动工作线程不会停止。  
要停止长时间运行的活动，请使用检测信号检测 Step Functions 是否已停止其分支并停止正在处理任务的工作线程。如果状态已失败，则调用 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskHeartbeat.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskHeartbeat.html)、[https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskSuccess.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskSuccess.html) 或 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskFailure.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskFailure.html) 将引发错误。请参阅[检测信号错误](https://docs.aws.amazon.com/step-functions/latest/apireference/API_SendTaskHeartbeat.html#API_SendTaskHeartbeat_Errors)。
运行中的 Lambda 函数无法停止。如果您已实施回退，请使用 `Wait` 状态，以便清理工作在 Lambda 函数完成后出现。