

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 平行工作流程狀態
<a name="state-parallel"></a>

**管理狀態和轉換資料**  
了解如何[使用變數在狀態與使用 JSONata 轉換資料之間傳遞資料](workflow-variables.md)。 [ JSONata](transforming-data.md)

`Parallel` 狀態 (`"Type": "Parallel"`) 可用於在狀態機器中新增個別的執行分支。

除了[常見狀態欄位](statemachine-structure.md#amazon-states-language-common-fields)以外，`Parallel` 狀態還引進下列額外欄位。

** `Branches` (必要)**  
指定要以平行方式執行狀態機器的物件陣列。每個這類狀態機器物件必須具有名為 `StartAt` 和 `States` 的欄位，其意義完全如同狀態機器最上層中的欄位。

**`Parameters` （選用，僅限 JSONPath)**  
用來將資訊傳遞至`Branches`陣列中定義的狀態機器。

**`Arguments` （選用，僅限 JSONata)**  
用來將資訊傳遞給已連線資源的 API 動作。值可以包含 JSONata 表達式。如需詳細資訊，請參閱[在 Step Functions 中使用 JSONata 轉換資料](transforming-data.md)。

**`Output` （選用，僅限 JSONata)**  
用來指定和轉換 狀態的輸出。指定時，該值會覆寫狀態輸出預設值。  
輸出欄位接受任何 JSON 值 （物件、陣列、字串、數字、布林值、 null)。任何字串值，包括物件或陣列內的值，如果被 \$1% %\$1 字元包圍，將評估為 JSONata。  
 輸出也直接接受 JSONata 表達式，例如：「輸出」：「\$1% jsonata 表達式 %\$1」   
如需詳細資訊，請參閱[在 Step Functions 中使用 JSONata 轉換資料](transforming-data.md)。

** `Assign` (選用)**  
用來存放變數。`Assign` 欄位接受具有定義變數名稱及其指派值之金鑰/值對的 JSON 物件。任何字串值，包括物件或陣列內的值，都會在以`{% %}`字元包圍時評估為 JSONata   
如需詳細資訊，請參閱[使用變數在狀態之間傳遞資料](workflow-variables.md)。

** `ResultPath` （選用，僅限 JSONPath)**  
指定要將分支的輸出放置於何處 (在輸入中)。輸入會先依據 `OutputPath` 欄位 (如果有的話) 所指定篩選，而後做為狀態的輸出。如需詳細資訊，請參閱[輸入和輸出處理](concepts-input-output-filtering.md)。

** `ResultSelector` （選用，僅限 JSONPath)**  
傳遞金鑰值對的集合，其中值為靜態或從結果中選取。如需詳細資訊，請參閱[ResultSelector](input-output-inputpath-params.md#input-output-resultselector)。

** `Retry` (選用)**  
稱為 Retrier 的物件陣列，這類物件可定義狀態發生執行時間錯誤時的重試政策。如需詳細資訊，請參閱[使用重試和擷取的狀態機器範例](concepts-error-handling.md#error-handling-examples)。

** `Catch` (選用)**  
稱為 Catcher 的物件陣列，這類物件可定義在狀態發生執行時間錯誤以及其重試政策已耗盡或未定義時執行的備用狀態。如需詳細資訊，請參閱[備用狀態](concepts-error-handling.md#error-handling-fallback-states)。

`Parallel` 狀態會導致 AWS Step Functions 執行每個分支，從該分支的 `StartAt`欄位中名為 的狀態開始，並盡可能同時執行，並等到所有分支終止 （達到結束狀態） 後再處理`Parallel`狀態的 `Next` 欄位。

## Parallel 狀態範例
<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 主控台中視覺化工作流程的外觀。

![\[範例平行工作流程的視覺化圖形。\]](http://docs.aws.amazon.com/zh_tw/step-functions/latest/dg/images/parallel-state.png)


每個分支必須可獨立自主運作。一個 `Parallel` 狀態分支中的狀態不得有以該分支外部欄位為目標的 `Next` 欄位，而且分支外部的任何其他狀態也不能轉移到該分支。

## Parallel 狀態輸入和輸出處理
<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 ]
```

**提示**  
如果您在狀態機器中使用的平行或映射狀態傳回陣列，您可以將它們轉換為具有 [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 會在發生錯誤時停止執行。

**注意**  
當平行狀態失敗時，調用 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 函數完成後進行清除工作。