Swift Concurrency(并发)学习

Swift 的并发模型是基于 异步任务任务调度 的一套现代化的异步编程工具。以下是相关语法规则总结


1. 异步函数(async)与 await

  • async 用于声明一个异步函数,表示函数可能会执行耗时任务,例如网络请求、文件读写等。
  • 在调用异步函数时,使用 await 关键字等待函数返回结果。

示例

func fetchUserID(from server: String) async -> Int {if server == "primary" {return 97}return 501
}
  • async 声明: 表示 fetchUserID 是异步函数。
  • 返回值类型: async 函数支持返回值,格式为 async -> ReturnType
  • 在异步函数内部,可以通过一些耗时操作(如网络请求)返回结果。

调用异步函数

func fetchUsername(from server: String) async -> String {let userID = await fetchUserID(from: server) // 用 await 调用异步函数if userID == 501 {return "John Appleseed"}return "Guest"
}
  • await 关键字: 调用异步函数时需要等待其执行完成。
  • 通过 await,程序会暂停当前任务,直到异步函数返回结果。

2. 使用 async let 实现并发任务

  • 如果多个异步任务之间互不依赖,可以用 async let 并发地执行它们。
  • async let 启动的任务是并发运行的,但当你使用返回值时需要用 await

示例

func connectUser(to server: String) async {async let userID = fetchUserID(from: server) // 异步获取 userIDasync let username = fetchUsername(from: server) // 异步获取 username// 等待两个任务完成,合并结果let greeting = await "Hello \(username), user ID \(userID)"print(greeting)
}
  • async let 声明异步任务,让它们同时运行。
  • await 当需要用返回值时才等待任务完成。
  • 并发执行可以显著提升性能,尤其在多个任务需要执行时。

3. 使用 Task 从同步代码中调用异步函数

  • 如果当前代码是同步上下文(比如普通函数或全局代码),可以用 Task 调用异步函数。

示例

Task {await connectUser(to: "primary")
}
// 输出:Hello Guest, user ID 97
  • Task 一个封装异步代码的上下文,它不会阻塞当前线程。
  • 执行顺序: Task 会在后台运行,不会阻塞主线程。

4. 使用 TaskGroup 进行任务分组

  • TaskGroup 是 Swift 的一种工具,用于管理一组并发任务。
  • 使用任务分组时,可以动态添加任务并收集任务结果。

示例

let userIDs = await withTaskGroup(of: Int.self) { group infor server in ["primary", "secondary", "development"] {group.addTask {return await fetchUserID(from: server)}}var results: [Int] = []for await result in group {results.append(result)}return results
}
  • withTaskGroup 创建一个任务组。
  • group.addTask 动态向任务组中添加任务。
  • for await 异步地收集任务结果。
输出:

假设 fetchUserID 返回的结果为 [97, 501, 97],最终的 userIDs[97, 501, 97]


5. Actor

  • Actor 是 Swift 提供的一种结构,保证并发访问的安全性。
  • 与类(class)类似,actor 也可以包含属性和方法。
  • 区别:
    • Actor 是并发安全的:它会序列化对其属性的访问,避免数据竞争。
    • 在调用 Actor 的方法或访问属性时,必须使用 await

示例

actor ServerConnection {var server: String = "primary"private var activeUsers: [Int] = []func connect() async -> Int {let userID = await fetchUserID(from: server)activeUsers.append(userID)return userID}
}let server = ServerConnection()
let userID = await server.connect()
  • Actor 的特点:
    • ServerConnection 中的 serveractiveUsers 属性只能通过 Actor 内部的方法访问。
    • 调用 connect 方法时必须用 await,因为它可能涉及异步操作。

6. 重要语法总结

  1. asyncawait
    • 用于声明和调用异步函数。
    • 异步函数可以暂停当前任务,等待其他任务完成。
  2. async let
    • 并发地启动多个异步任务,但只在需要时等待结果。
  3. Task
    • 用于从同步代码中调用异步函数。
  4. TaskGroup
    • 管理多个并发任务,并收集它们的结果。
  5. Actor:
    • 确保对共享状态的并发访问是安全的。

7. 拓展知识

Swift 的并发功能建立在底层 GCD(Grand Central Dispatch)Swift Concurrency Runtime 之上,以下是一些拓展知识:

7.1 串行队列 vs 并发队列

  • 串行队列: 一个任务完成后才开始下一个任务。
  • 并发队列: 多个任务同时运行,但完成顺序不保证。

7.2 异步序列和迭代

Swift 支持 异步序列(AsyncSequence,可以异步地遍历序列:

struct Counter: AsyncSequence {typealias Element = Intlet end: Intfunc makeAsyncIterator() -> AsyncIterator {return AsyncIterator(end: end)}struct AsyncIterator: AsyncIteratorProtocol {let end: Intvar current = 0mutating func next() async -> Int? {current += 1return current <= end ? current : nil}}
}for await number in Counter(end: 5) {print(number)
}
// 输出:1 2 3 4 5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/503275.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Matlab的变压器仿真模型建模方法(13):单相升压自耦变压器的等效电路和仿真模型

1.单相升压自耦变压器的基本方程和等效电路 单相升压自耦变压器的接线原理图如图1所示。在建立自耦变压器的基本方程时,仍然把它看成是从双绕组变压器演变而来。在图1中,设节点a到节点b部分的绕组的匝数为,对应于双绕组变压器的原边绕组;节点c到节点a部分的绕组的绕组匝数为…

Java最新面试题(全网最全、最细、附答案)

一、Java基础 1、基础概念与常识Java 语言有哪些特点? 简单易学&#xff08;语法简单&#xff0c;上手容易&#xff09;&#xff1b;面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b;平台无关性&#xff08; Java 虚拟机实现平台无关性&a…

【简博士统计学习方法】3. 统计学习方法的三要素

3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间&#xff08;Hypothesis Space&#xff09;&#xff1a;所有可能的条件概率分布或决策函数&#xff0c;用 F \mathcal{F} F表示。 若定义为决策函数的集合&#xff1a; F { f ∣ Y f ( X ) } \mathcal{F…

C# 修改项目类型 应用程序程序改类库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

链上数据分析基础课:Puell倍数(Puell Multiple)

PUELL倍数&#xff08;Puell Multiple&#xff09;就是每日币发行金额除以365天的移动平均 每日币发行总额&#xff0c;简单说就是每天结算的币总量和过去一年的平均每天收成的比。这个指标能让我们大概了解矿工的收益情况&#xff0c;还能从矿工的角度看市场趋势和周期变化。 …

初学STM32 --- USMART

目录 USMART简介 USMART主要特点&#xff1a; USMART原理 USMART组成&#xff1a; USMART 的实现流程简单概括 USMART扫描函数&#xff1a; USMART系统命令 USMART移植 USMART简介 USMART是一个串口调试组件&#xff0c;可以大大提高代码调试效率&#xff01; USMART主…

对话|企业如何构建更完善的容器供应链安全防护体系

对话&#xff5c;企业如何构建更完善的容器供应链安全防护体系 云布道师 随着云计算和 DevOps 的兴起&#xff0c;容器技术和自动化成为软件开发中的必要手段&#xff0c;软件供应链也进入了自动化及 CI/CD 阶段。然而&#xff0c;容器技术和自动化虽然提升了软件的更新速度&…

Backend - EF Core(C# 操作数据库 DB)

目录 一、EF Core 1. 使用的ORM框架&#xff08;对象关系映射&#xff09; 2. EFCore 常见两种模式 3. EFCore 提供程序 二、 EF 操作数据库&#xff08;Code First&#xff09; 1. 下载NuGet插件 2.创建模型类文件 3.创建DBContext文件 4.Programs.cs文件 5.appsettings.Devel…

科研绘图系列:R语言单细胞数据常见的可视化图形

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理图1图2图3图4图5图6系统信息参考介绍 单细胞数据常见的可视化图形 因为本教程是单细胞数据,因此运行本画图脚本需要电脑的内存最少32Gb 加载…

jenkins入门7 --发送邮件1

jenkins发送邮件配置&#xff08;全局配置&#xff09;_jenkins 怎么发送邮件-CSDN博客 本文通过163发送邮件 1、首先163设置选择pop3/smtp/imap,开启服务&#xff0c;获取授权码 2、jenkins下载邮件插件 登录Jenkins管理界面&#xff0c;点击“Manage Jenkins”。 选择“Man…

30、论文阅读:基于小波的傅里叶信息交互与频率扩散调整的水下图像恢复

Wavelet-based Fourier Information Interaction with Frequency Diffusion Adjustment for Underwater Image Restoration 摘要介绍相关工作水下图像增强扩散模型 论文方法整体架构离散小波变换与傅里叶变换频率初步增强Wide Transformer BlockSpatial-Frequency Fusion Block…

衡量算法效率的方法:时间复杂度、空间复杂度

衡量算法效率的方法&#xff1a;时间复杂度、空间复杂度 一、好算法的特点二、算法效率分析1. 时间复杂度2. 空间复杂度 一、好算法的特点 算法是用数学解决问题的方法。一个好算法有以下几个特点&#xff1a; ①正确性&#xff1a;能正确处理各种输入&#xff08;合法输入、非…

go如何从入门进阶到高级

针对Go语言的学习&#xff0c;不同阶段应采取不同的学习方式&#xff0c;以达到最佳效果.本文将Go的学习分为入门、实战、进阶三个阶段&#xff0c;下面分别详细介绍 一、社区 Go语言中文网 作为专注于Go语言学习与推广的平台&#xff0c;Go语言中文网为开发者提供了丰富的中…

苹果系统MacOS下ObjectC建立的App程序访问opencv加载图片程序

前言 苹果系统下使用opencv感觉还是有些不太方便&#xff0c;总是感觉有点受到限制。本博客描述的是在MacOS下建立App程序然后调用opencv显示图片时出现的一些问题并最后解决的一个过程。 一、程序的建立 选择程序的类型&#xff1a; 选择界面模式和编程语言&#xff1a; 其余…

Nginx——入门介绍、安装与核心配置文件结构(一/五)

目录 1.Nginx 简介1.1.背景介绍1.2.名词解释1.3.常见服务器对比1.3.1.IIS1.3.2.Tomcat1.3.3.Apache1.3.4.Lighttpd1.3.5.其他的服务器 1.4.Nginx 的优点1.4.1.速度更快、并发更高1.4.2.配置简单&#xff0c;扩展性强1.4.3.高可靠性1.4.4.热部署1.4.5.成本低、BSD 许可证 1.5.Ng…

【HarmonyOS-ArkTS语言】计算器的实现【合集】

目录 &#x1f60b;环境配置&#xff1a;华为HarmonyOS开发者 &#x1f3af;学习小目标&#xff1a; &#x1f4fa;演示效果&#xff1a; &#x1f4d6;实验步骤及方法&#xff1a; 1. 在index.ets文件中通过 Extend(Button) 装饰器扩展Button 组件设置按钮样式函数myButt…

【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 1、输入数值 2、选择结构语句 3、计算结果并输出 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序&#xff0c;该程序需输入个人数据&#xff0c;进而预测其成年后的身高。 相关知识 为了完成本…

【连续学习之LwM算法】2019年CVPR顶会论文:Learning without memorizing

1 介绍 年份&#xff1a;2019 期刊&#xff1a; 2019CVPR 引用量&#xff1a;611 Dhar P, Singh R V, Peng K C, et al. Learning without memorizing[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2019: 5138-5146. 本文提…

【微服务】3、配置管理

微服务配置管理 已掌握的微服务组件及配置管理问题引出 已掌握注册中心、Openfan、远程调用、负载均衡、网关等组件&#xff0c;具备微服务开发能力&#xff0c;但仍存在其他问题待解决。微服务和网关存在大量配置文件&#xff0c;其中包含很多重复配置&#xff0c;如数据库、日…

【论文+源码】基于Spring和Spring MVC的汉服文化宣传网站

为了实现一个基于Spring和Spring MVC的汉服文化宣传网站,我们需要创建一个简单的Web应用程序来展示汉服文化和相关信息。这个系统将包括以下几个部分: 数据库表设计:定义文章、用户和评论的相关表。实体类:表示数据库中的数据。DAO层接口及MyBatis映射文件:用于与数据库交…