/* Page prose (zh-Hans) */
"SerialVsConcurrent" = "# 串行 vs. 并发：顺序与重叠\n\n每个队列要么是**串行的**，要么是**并发的**，而这个区别是关于队列你需要理解的最重要的一件事。\n\n* 一个**串行队列**一次运行一个闭包，直到它完成，按照你添加它们的顺序（FIFO）。它的任务永远不会有两个重叠。一个咖啡师，一次一张票。\n* 一个**并发队列**可能同时在多个线程上运行它的许多闭包。它按顺序*开始*它们，但它们可以按任意顺序完成。许多咖啡师从同一条轨道上取票。\n\n主队列是串行的。全局队列是并发的。一个自定义队列是串行的，除非你用 `attributes: .concurrent` 主动选择并发。\n\n这里是一个保持严格顺序的**串行**自定义队列：\n\n```swift\n// Serial by default: one order finished before the next starts.\nlet counter = DispatchQueue(label: \"coffee-bar.serial\")\n\nfor order in 1...4 {\n    counter.async {\n        Thread.sleep(forTimeInterval: 0.2)  // brewing time\n        print(\"Served order #\\(order)\")\n    }\n}\n```\n\n单独运行它，订单每一次都总是按 `1, 2, 3, 4` 这个顺序打印。串行队列是一种承诺：任务一个接一个地运行，按提交的顺序。\n\n现在在下面的一个**并发**队列上运行同样的四个订单。";
"SerialVsConcurrent-2" = "**观察运行：**订单编号出来时是**乱序的**：这一次也许是 `3, 1, 4, 2`，下一次又是别的。它们按顺序*开始*，但并行运行，谁的随机冲泡时间到了就先完成。这种非确定性是真实存在的：运行它几次，你会看到不同的顺序。如果你的代码曾经依赖并发任务的完成顺序，那就是一个迟早会发生的 bug。\n\n* callout(试一试): 连续运行它三次。你有没有得到过 `1, 2, 3, 4`？现在删掉 `attributes: .concurrent`，再运行它三次。\n\n[上一页](@previous)  |  第 5 / 9 页  |  [下一页: 返回之旅：跳回主线程](@next)";
