/* Page prose (zh-Hans) */
"WrappingUp" = "# 小结\n\n当并行工作的数量是在运行时决定、而不是在源代码里固定时，task group 就是你要选用的工具：把工作扇出去，然后在它们完成时收集结果，由结构化的作用域来保证什么都不会泄漏。让大多数人栽跟头的地方是结果的*顺序*，所以在你信赖它之前，先记住下面这些要点。\n\n* 当并行工作的数量是*动态*的时候，用 **task group**；当它是一个小的*固定*集合时，用 `async let`。\n* `withTaskGroup(of:)` 打开 group，`group.addTask { }` 为每个元素派生一个子任务，`for await result in group` 在结果完成时收集它们。\n* 结果按**完成顺序**到达，而不是提交顺序：如果你需要原来的顺序，就从每个子任务返回 `(index, value)`，并在最后排序；永远不要按到达位置去索引结果。\n* **通过遍历来消费这个 group。** 如果你 `addTask` 了却从不 `for await` 它，group 在作用域结束时仍然会等待每一个子任务；你只不过是把结果丢掉了。（如果你是有意要“发射后不管”的子任务，就用 `withDiscardingTaskGroup`，好让你是明确地这么表态。）\n* `withThrowingTaskGroup` 会重新抛出第一个子任务的错误并取消其余的；在 group 外围捕获它。如果你想改成跳过失败，就从一个普通的 group 里返回一个可选值。\n* **结构化保证**：只要还有子任务在运行，group 作用域就绝不返回，所以什么都不会泄漏；取消会向下传递给每一个子任务。\n* 对于很大的 `N`，**限制在途的数量**（先用 `N` 个任务预热，然后每完成一个就添加一个），以此约束内存和负载。\n\n---\n\n## 接下来\n\n下一章是 [Actors](Actors.playgroundchapter/Overview)。你一直在小心翼翼地避免在这些并行任务之间共享可变状态；现在来认识一下那个能让共享变得*安全*的类型。\n\n[上一页](@previous)  |  第 9 / 9 页";
