/* Page prose (zh-Hans) */
"Overview" = "# 组与信号量\n\n回到街角的咖啡吧，一位顾客为整个办公室点了一批饮品：一杯 latte、一杯 cold brew 和一杯 espresso。你把三杯一次全部发出，让它们并行冲煮。很好。但现在你有了一个新问题。只有当**三杯全部**就绪时你才能把托盘交给顾客，而每一杯都按各自的节奏完成。你的代码怎么*知道*这一批已经完成？如果五位 barista 在同一时刻都想用那一台 espresso 机器，又会发生什么？本章讲的是协调一组相互独立的任务：等待它们全部完成，以及限制同时运行的数量。\n\n---\n\n## 你将学到\n\n* 如何用 **`DispatchGroup`** 等待一整批异步任务。\n* `enter()`/`leave()` 的平衡、`notify(queue:)` 和 `wait()`，以及为什么 `wait()` 会阻塞。\n* 经典的 `enter`/`leave` 不平衡错误，以及它如何挂起或崩溃。\n* **`DispatchSemaphore`** 如何限制同时有多少任务访问某个资源。\n* 何时该用组、何时该用信号量。\n\n本章建立在 [GCD 基础](GCD%20Fundamentals.playgroundchapter/Overview) 这一章之上：你已经知道如何用 `async` 把工作推入队列，也知道串行队列和并发队列的区别。现在你要来协调这些工作。\n\n准备好之后，翻到下一页，我们会用最天真的方式发出一批饮品，然后看着它出问题。\n\n第 1 / 8 页  |  [下一页: 问题：如何知道一切都已完成](@next)";
