/* Page prose (ja) */
"WrappingUp" = "# まとめ\n\ntask group は、並列処理の数がソースコードに固定されているのではなく実行時に決まるときに使うものです。処理を展開し、終わった順に結果を集め、構造化されたスコープが何もリークしないことを保証します。ほとんどの人をつまずかせる落とし穴は結果の*順序*なので、信頼する前に以下の要点を心に留めておいてください。\n\n* 並列処理の数が*動的*なときは**task group** を使い、小さな*固定*の集合のときは `async let` を使いましょう。\n* `withTaskGroup(of:)` はグループを開き、`group.addTask { }` は要素ごとに子を生み、`for await result in group` は終わった順に結果を集めます。\n* 結果は送信順ではなく**完了順**に届きます。元の順序が必要なら各子から `(index, value)` を返して最後にソートしましょう。到着位置で結果にインデックスアクセスしてはいけません。\n* **グループは反復して消費しましょう。** `addTask` するだけで `for await` で反復しなければ、グループはやはりスコープの最後にすべての子を待ちます。ただ結果を捨てただけです。（意図的な撃ちっぱなしの子には、`withDiscardingTaskGroup` を使って、そう意図していることを明示しましょう。）\n* `withThrowingTaskGroup` は最初の子のエラーを再スローし、残りをキャンセルします。グループの周りで catch しましょう。代わりに失敗をスキップするなら、単純なグループからオプショナルを返します。\n* **構造化された保証**。子がまだ実行中の間はグループのスコープが戻らないので、何もリークしません。キャンセルはすべての子へと下へ流れます。\n* 大きな `N` に対しては、メモリと負荷を有界に保つために**実行中の数を制限しましょう**（`N` 個のタスクで呼び水を入れ、それぞれが終わるたびに1つ追加する）。\n\n---\n\n## 次は\n\n次の章は [Actors](Actors.playgroundchapter/Overview) です。これらの並列タスクをまたいで共有される可変状態を、これまで注意深く避けてきました。いよいよ、それを共有しても*安全*にする型に出会いましょう。\n\n[前へ](@previous)  |  9 / 9 ページ";
