本文档描述了 Swift 的任务系统和异步运行时,它们构成了 Swift 并发模型的基础。任务是 Swift 结构化并发架构的基本单元,代表了可以创建、调度、等待和取消的异步工作。有关在此基础上构建的 Actor 的信息,请参阅Actor 和隔离。
任务是 Swift 并发系统中的一个异步工作单元。每个任务都具有
来源:[include/swift/ABI/Task.h:66-175], [include/swift/ABI/Task.h:344-536], [stdlib/public/Concurrency/Task.cpp:81-127]
来源:[stdlib/public/Concurrency/Task.cpp:193-316], [stdlib/public/Concurrency/Task.swift:197-229]
Swift 支持多种类型的任务,每种任务都有不同的行为和用例。
| 任务类型 | 创建方法 | 关系 | 继承 | 描述 |
|---|---|---|---|---|
| 无结构化 | Task {} | 独立 | 上下文和任务局部值 | 在当前 Actor 的上下文中执行 |
| 分离 | Task.detached {} | 无父级 | 无 | 完全独立的任务 |
| 子级 | 通过任务组或 async-let | 有父级 | 优先级和任务局部值 | 结构化的子任务 |
| 组子级 | group.addTask {} | 有父任务组 | 优先级和任务局部值 | 任务组中的子任务 |
| Async-let | async let x = expr | 有父级 | 优先级和任务局部值 | Async let 的特殊子任务 |
每种任务类型在创建时都带有特定的标志,这些标志决定了其继承行为以及与其他任务的关系。
来源:[stdlib/public/Concurrency/Task.swift:585-815], [stdlib/public/Concurrency/Task.cpp:678-950]
任务在运行时由 `AsyncTask` 类表示,该类扩展了 `Job` 类。任务可能包含额外的片段,具体取决于其类型。
任务内存通过专门的分配器进行管理,该分配器可以快速分配任务特定的内存,并在任务完成后自动释放。
来源:[stdlib/public/Concurrency/Task.cpp:678-720], [include/swift/ABI/Task.h:344-536], [stdlib/public/Concurrency/Task.cpp:497-550]
任务由执行器执行,执行器决定任务何时何地运行。Swift 有几种类型的执行器:
任务可以调度到执行器上。
执行器负责对任务进行优先级排序,并确保它们在正确的上下文中运行。优先级较高的任务可能会先于优先级较低的任务执行。
来源:[stdlib/public/Concurrency/Actor.cpp:214-361], [stdlib/public/Concurrency/Task.cpp:225-315], [stdlib/public/Concurrency/PartialAsyncTask.swift:96-154]
Swift 任务具有优先级系统,有助于确定执行顺序。
优先级用于
来源:[stdlib/public/Concurrency/Task.swift:277-382], [stdlib/public/Concurrency/Task.cpp:837-910]
任务组允许管理子任务的动态集合。主要有两种类型:
任务组提供以下操作:
来源:[stdlib/public/Concurrency/TaskGroup.swift:65-825], [stdlib/public/Concurrency/TaskGroup.cpp:156-479], [stdlib/public/Concurrency/DiscardingTaskGroup.swift:15-84]
任务可以被取消,这意味着它们应尽快停止执行。取消是协作性的,即任务需要检查并响应取消。
取消有几个关键属性:
来源:[stdlib/public/Concurrency/Task.swift:197-229], [stdlib/public/Concurrency/TaskCancellation.swift:16-73]
任务局部值是隐式随任务携带并可被任务子任务访问的值。
任务局部值
来源:[stdlib/public/Concurrency/TaskLocal.swift:32-144], [stdlib/public/Concurrency/TaskLocal.cpp:86-200]
Swift 异步运行时实现了一种类似 future 的模式,其中任务可以表示一个未来的值。其他任务可以使用 `await` 关键字等待此值。
关键概念:
来源:[stdlib/public/Concurrency/Task.cpp:114-197], [stdlib/public/Concurrency/Task.swift:155-195]
当任务等待异步操作时,它会挂起执行并创建一个 continuation,该 continuation 可用于稍后恢复任务。
Swift 提供了几种类型的 continuations:
来源:[stdlib/public/Concurrency/CheckedContinuation.swift:15-90], [stdlib/public/Concurrency/Task.cpp:497-613]
Swift 任务系统实现涉及 Swift 代码和底层运行时支持之间的复杂交互。
该实现处理优先级继承、任务局部值传播和取消等细节,使这些功能对 Swift 开发人员来说大多是透明的。
来源:[stdlib/public/Concurrency/Task.cpp:678-950], [stdlib/public/Concurrency/TaskPrivate.h:60-109], [include/swift/Runtime/Concurrency.h:60-365]