一、概念
一、协程(Coroutine)是一种轻量级线程,允许程序在执行过程中主动挂起(yield)和恢复(resume),通过协作式调度实现并发。与传统线程相比,协程的上下文切换成本更低,适合高并发场景。
二、Swift 的协程实现基于 Swift Concurrency 模型 (Swift 5.5+),不是传统意义上的协程,而是通过编译器生成的状态机 和协作式任务调度实现的异步编程范式;
它提供了一种结构化的方式来编写异步代码,使其看起来更像同步代码,同时保持了异步执行的性能优势。
二、场景
多人协作项目
假设一个团队在开发一个应用:
- 同步方式:设计师必须完成所有设计,然后开发人员才能开始编码,测试人员必须等开发完成才能测试。
- 协程方式:设计师可以开始设计,开发人员可以基于初步设计开始编码,测试人员可以先编写测试框架,三者并行进行。
三、异步函数 :使用 async
关键字标记的函数,可以包含异步操作。
Swift
// 异步函数示例
func fetchData() async throws -> Data {
let url = URL(string: "https://example.com/data.json")!
let (data, _) = try await URLSession.shared.data(from: url)
return data
}
四、等待操作 :使用 await
关键字等待异步操作完成。
五、异步序列:处理一系列异步产生的值。
Swift
func generateNumbers() async -> AsyncThrowingStream<Int, Error> {
return AsyncThrowingStream { continuation in
var counter = 0
let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
counter += 1
if counter <= 5 {
continuation.yield(counter)
} else {
continuation.finish()
}
}
// 确保计时器在流完成时被释放
continuation.onTermination = { @Sendable _ in
timer.invalidate()
}
}
}
六、任务组:并行执行多个异步任务。
Swift
func processMultipleItems() async throws {
try await withThrowingTaskGroup(of: String.self) { group in
// 添加多个任务到组中
for i in 1...3 {
group.addTask {
try await Task.sleep(nanoseconds: UInt64(i * 1_000_000_000))
return "Task \(i) completed"
}
}
// 处理每个任务的结果
for try await result in group {
print(result)
}
}
}
使用示例
Swift
// 使用示例
Task {
do {
// 调用异步函数
let data = try await fetchData()
print("Fetched \(data.count) bytes")
// 使用异步序列
for try await number in generateNumbers() {
print("Received number: \(number)")
}
// 使用任务组
try await processMultipleItems()
} catch {
print("Error: \(error)")
}
}