swift-协程

一、概念

一、协程(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)")
    }
}
相关推荐
troy12810 分钟前
Java 技术栈全景指南:从基础到微服务的完整知识体系
java·开发语言·微服务
Escalating_xu14 分钟前
【C 语言】深入理解指针(2):数组名、数组传参、二级指针与指针数组
java·c语言·开发语言
郝学胜-神的一滴16 分钟前
游戏引擎原理与实践 01:聊聊游戏引擎的前世今生
开发语言·c++·游戏引擎·产品运营·软件工程·产品经理·untiy
bkspiderx1 小时前
Qt 的消息机制:事件驱动与信号槽的底层逻辑
开发语言·qt·信号槽·事件驱动·qt 的消息机制
晴天的雨.9921 小时前
【C++算法】三数之和
开发语言·c++·算法
传奇开心果编程1 小时前
【Flutter入门练中学】第11课:状态管理进阶与声明式路由
android·学习·flutter·ui·ios
AC赳赳老秦1 小时前
公开 CSV 数据集批量处理实战:用 OpenClaw 高效完成下载、清洗与标准化分析样本生成
java·开发语言·汇编·c++·python·deepseek·openclaw
JasonSJX1 小时前
四端自建播放器怎么落地:Android、iOS、tvOS、Tizen 的 DRM 播放 SDK 技术盘点
android·ios·音视频·视频防录屏·加密保护课程·直播安全
j7~1 小时前
【Python】(篇七)《使用Python库》 -- 详解
开发语言·后端·python·编程学习·python标准库·python第三方库·python拓展
心中有你02142 小时前
C语言实现文件异或加密与RLE压缩算法
c语言·开发语言