Task Group简介
Swift的结构化并发通过Task Group提供了一种优雅的方式来管理一组相关的异步任务。与普通Task的独立执行不同,Task Group允许开发者并行运行多个子任务,并集中处理结果或错误。这一机制在需要批量执行异步操作时尤为强大,例如同时下载多张图片或处理多个API请求。本节将介绍Task Group的基本概念、核心作用及其在Swift并发体系中的地位,带你进入结构化并发的世界。
什么是Task Group?
Task Group是Swift并发模型中的一种结构化工具,通过withTaskGroup或withThrowingTaskGroup函数创建。它定义了一个任务组,允许在其中添加多个子任务,并等待所有任务完成。Task Group的主要特点包括:
- 并行执行:子任务并发运行,利用多核处理器。
- 结果收集:统一获取所有子任务的结果。
- 结构化管理:任务之间的关系明确,生命周期受控。
与普通Task的对比:
- 普通Task:独立运行,需手动等待结果。
- Task Group:组内任务统一调度,结果集中处理。
基本示例:
func fetchItem(id: Int) async -> String {
try? await Task.sleep(nanoseconds: 1_000_000_000)
return "项目\(id)"
}
Task {
let results = await withTaskGroup(of: String.self) { group in
for id in 1...3 {
group.addTask {
await fetchItem(id: id)
}
}
var collected = [String]()
for await result in group {
collected.append(result)
}
return collected
}
print("结果:\(results)")
}
输出:
结果:["项目1", "项目2", "项目3"]
of: String.self:指定子任务返回类型。addTask:添加子任务。for await:收集结果。
核心作用
Task Group在Swift并发中扮演了重要角色:
并行处理
多个任务同时运行,缩短总执行时间。例如,三次fetchItem并行只需约1秒,而串行需3秒。结构化并发
子任务的生命周期绑定到组,自动清理,避免资源泄漏。统一结果管理
通过迭代组收集所有结果,无需手动跟踪每个Task。错误传播
在抛出错误的组中,任意子任务失败会导致整个组提前结束。
它解决了普通Task在多任务场景下的分散管理问题。
创建Task Group的方式
Swift提供了两种主要方式创建Task Group:
1. withTaskGroup
用于无错误的子任务,返回结果集合:
let items = await withTaskGroup(of: Int.self) { group in
for i in 1...5 {
group.addTask {
try? await Task.sleep(nanoseconds: 500_000_000)
return i * 2
}
}
return await group.reduce(0, +) // 累加结果
}
print("总和:\(items)") // 输出:总和:30
reduce:直接聚合结果。
2. withThrowingTaskGroup
支持抛出错误的子任务:
enum FetchError: Error {
case failed
}
func fetchWithError(id: Int) async throws -> Int {
try await Task.sleep(nanoseconds: 500_000_000)
if id == 3 { throw FetchError.failed }
return id
}
Task {
do {
let sum = try await withThrowingTaskGroup(of: Int.self) { group in
for id in 1...5 {
group.addTask {
try await fetchWithError(id: id)
}
}
return try await group.reduce(0, +)
}
print("总和:\(sum)")
} catch {
print("错误:\(error)")
}
}
输出(因错误提前结束):
错误:failed
- 错误抛出后,组内未完成任务被取消。
与普通Task的区别
| 特性 | 普通Task | Task Group |
|---|---|---|
| 执行方式 | 独立运行 | 并行组内任务 |
| 结果收集 | 手动等待value | 自动聚合结果 |
| 生命周期 | 需手动管理 | 组内自动清理 |
| 错误处理 | 单独捕获 | 统一抛出 |
Task Group将分散的任务组织为一个整体,提升了并发管理的效率。
使用场景
Task Group适用于以下场景:
- 批量下载:并行获取多张图片或文件。
- 并行API调用:同时请求多个数据端点。
- 数据处理:对数据集分片并行计算。
例如,下载多张图片的伪代码:
let images = await withTaskGroup(of: UIImage.self) { group in
for url in imageURLs {
group.addTask { await downloadImage(from: url) }
}
return await group.compactMap { $0 }
}
注意事项
任务添加时机
必须在返回结果前添加所有任务,组迭代开始后无法新增。线程安全
子任务运行于后台,结果处理可能需切换到主线程。性能考量
过多子任务可能耗尽线程池,需平衡并行度。
小结
Task Group是Swift结构化并发的核心工具,通过并行执行和统一管理子任务,简化了多任务场景的处理。本节介绍了其定义、创建方式和基本用法,展示了它相较普通Task的优势。掌握Task Group,你将能高效处理批量异步操作。下一节将深入探讨并行任务的执行与结果聚合,进一步扩展你的并发技能。
内容说明
- 结构:从概念到作用,再到创建方式和对比,最后总结。
- 代码:包含简单示例和抛错示例,突出实用性。
- 语气:讲解性且基础性,适合新章节开篇。
- 衔接:承接第七章(
Task管理),预告后续(并行执行)。
