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中的server和activeUsers属性只能通过 Actor 内部的方法访问。- 调用
connect方法时必须用await,因为它可能涉及异步操作。
6. 重要语法总结
async和await:- 用于声明和调用异步函数。
- 异步函数可以暂停当前任务,等待其他任务完成。
async let:- 并发地启动多个异步任务,但只在需要时等待结果。
Task:- 用于从同步代码中调用异步函数。
TaskGroup:- 管理多个并发任务,并收集它们的结果。
- 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
相关文章:
Swift Concurrency(并发)学习
Swift 的并发模型是基于 异步任务 和 任务调度 的一套现代化的异步编程工具。以下是相关语法规则总结 1. 异步函数(async)与 await async 用于声明一个异步函数,表示函数可能会执行耗时任务,例如网络请求、文件读写等。在调用异步…...
从0开始的opencv之旅(1)cv::Mat的使用
目录 Mat 存储方法 创建一个指定像素方式的图像。 尽管我们完全可以把cv::Mat当作一个黑盒,但是笔者的建议是仍然要深入理解和学习cv::Mat自身的构造逻辑和存储原理,这样在查找问题,或者是遇到一些奇奇怪怪的图像显示问题的时候能够快速的想…...
Hoverfly 任意文件读取漏洞(CVE-2024-45388)
漏洞简介 Hoverfly 是一个为开发人员和测试人员提供的轻量级服务虚拟化/API模拟/API模拟工具。其 /api/v2/simulation 的 POST 处理程序允许用户从用户指定的文件内容中创建新的模拟视图。然而,这一功能可能被攻击者利用来读取 Hoverfly 服务器上的任意文件。尽管…...
详解网络管理
网络管理是指对计算机网络资源、设备和服务的有效配置、监控、管理和优化的过程。它的目的是确保网络的高效、可靠和安全运行。网络管理的关键任务包括网络监控、配置管理、性能管理、安全管理、故障管理和计费管理。下面是详细的讲解: 1. 网络管理的目标 高可用性…...
iOS 11 中的 HEIF 图像格式 - 您需要了解的内容
HEIF,也称为高效图像格式,是iOS 11 之后发布的新图像格式,以能够在不压缩图像质量的情况下以较小尺寸保存照片而闻名。换句话说,HEIF 图像格式可以具有相同或更好的照片质量,同时比 JPEG、PNG、GIF、TIFF 占用更少的设…...
深入AIGC领域:ChatGPT开发者获取OpenAI API Key的实用指南
在AIGC(人工智能生成内容)领域,ChatGPT作为一种强大的自然语言处理工具,正逐渐成为开发者们不可或缺的助手。然而,要充分发挥ChatGPT的潜力,首先需要获取OpenAI的API Key。本文将详细介绍如何获取OpenAI AP…...
软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计
一、实验内容 1. 绘制工资支付系统的功能结构图和数据库 在系统设计阶段,要设计软件体系结构,即是确定软件系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。同时把模块组织成良好的层次系统:顶层模块通过调用它的下层…...
密码学精简版
密码学是数学上的一个分支,同时也是计算机安全方向上很重要的基础原理,设置密码的目的是保证信息的机密性、完整性和不可抵赖性,安全方向上另外的功能——可用性则无法保证,可用性有两种方案保证,冗余和备份࿰…...
开源模型迎来颠覆性突破:DeepSeek-V3与Qwen2.5如何重塑AI格局?
不用再纠结选择哪个AI模型了!chatTools 一站式提供o1推理模型、GPT4o、Claude和Gemini等多种选择,快来体验吧! 在全球人工智能模型快速发展的浪潮中,开源模型正逐渐成为一股不可忽视的力量。近日,DeepSeek-V3和Qwen 2.…...
【51单片机零基础-chapter4:LED数码管】
LED数码管本质是一种廉价的显示器,由多个发光二极管封装组成的8字形器件 如果要显示6,那么需要点亮除了B以外的所有段,并且开发板上默认是共阴极 阳极A->G除了B全点亮,所以7,4,2,1,9,10全接正极:10111110 这个就是段码,表示显示的数据 静态LED显示 开发板上是四个一体…...
【网络】什么是路由协议(Routing Protocols)?常见的路由协议包括RIP、OSPF、EIGRP和BGP
路由协议(Routing Protocols) 像 google map RIP (Routing Information Protocol):跳数 超了就废了 OSPF(Open Shortest Path First) 就好像拿着map找最短距离(跳数) EIGRP(Enhanced Interior Gateway Routing Protoco…...
Unity3D ILRuntime开发原则与接口绑定详解
引言 ILRuntime是一款基于C#的热更新框架,使用IL2CPP技术将C#代码转换成C代码,支持动态编译和执行代码,适用于Unity3D的所有平台,包括Android、iOS、Windows、Mac等。本文将详细介绍ILRuntime在Unity3D中的开发原则及接口绑定技术…...
闻泰科技涨停-操盘训练营实战-选股和操作技术解密
如上图,闻泰科技,今日涨停,这是前两天分享布局的一个潜伏短线的标的。 选股思路: 1.主图指标三条智能辅助线粘合聚拢,即将选择方向 2.上图红色框住部分,在三线聚拢位置,震荡筑底,…...
我用AI学Android Jetpack Compose之开篇
最近突发奇想,想学一下Jetpack Compose,打算用Ai学,学最新的技术应该要到官网学,不过Compose已经出来一段时间了,Ai肯定学过了,用Ai来学,应该问题不大,学习过程记录下来,…...
25考研王道数据机构课后习题-----顺序表链表部分
文章目录 1.顺序表题目2.链表相关题目3.我的个人总结 声明:以下内容来自于B站知名up主白话拆解数据结构,望获悉; 1.顺序表题目 下面的这个说的是:下面的哪一个是组成我们的顺序表的有限序列,这个应该是数据元素&#x…...
新能源电动汽车动力电池技术
新能源电动汽车动力电池技术是新能源汽车发展的核心之一,以下是动力电池技术的一些关键方面: 技术进展 能量密度提升:近年来,动力电池的能量密度有了显著提升,从2010年的100Wh/kg提高到2024年的300Wh/kg。能量密度的…...
修复 ITunes 在 Windows 或 Mac 上不断崩溃的问题 [100% 有效]
对于 iDevice 用户来说,只能通过 iTunes 在 iDevice 和计算机之间传输文件的困境一直是一个紧迫的问题。所有 iPhone 用户可能都知道,iTunes 并不是一款高效的应用程序,有时性能会很差,例如在 iDevices 和计算机之间传输文件时不断…...
Android设备使用AOA协议进行主机与配件模式通信
1.使用TYPC-C数据线连接两台华为手机: TYPE-C线,先连接下图右边的ACCESSORY 再连接左边的HOST 此时左边的HOST(白色) 会给右边的ACCESSORY(黑色) 充电 接着打开左连接的HostChart会自动调起授权,然后会启动右边的AccessoryChart USB HOS…...
Python爬虫入门实例:Python7个爬虫小案例(附源码)
引言 随着互联网的快速发展,数据成为了新时代的石油。Python作为一种高效、易学的编程语言,在数据采集领域有着广泛的应用。本文将详细讲解Python爬虫的原理、常用库以及实战案例,帮助读者掌握爬虫技能。 一、爬虫原理 爬虫,又…...
生成对抗网络 (Generative Adversarial Network, GAN) 算法MNIST图像生成任务及CelebA图像超分辨率任务
生成对抗网络 (Generative Adversarial Network, GAN) 算法详解与PyTorch实现 目录 生成对抗网络 (Generative Adversarial Network, GAN) 算法详解与PyTorch实现1. 生成对抗网络 (GAN) 算法概述1.1 生成器与判别器1.2 GAN的优势2. GAN的核心技术2.1 目标函数2.2 生成器2.3 判别…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
