Swift从0开始学习 并发性 day4

1. 异步函数和 async/await

async 表示函数是异步的,可以执行一些耗时操作而不阻塞线程。await 用来等待异步操作的完成。它让代码看起来像是同步的,但实际上在异步执行。

func fetchData() async -> String {// 模拟网络请求return "Data from server"
}func processData() async {let data = await fetchData()print(data) // 输出: Data from server
}
2. 任务和任务组

Task 代表一个异步操作。Task 可以是单独的任务,也可以组成 TaskGroup 进行并行执行。

特性

  • TaskGroup 提供了一种简单的方式来管理多个并发任务。

  • Task 和 TaskGroup 都可以自动管理生命周期,避免内存泄漏。

Task 来启动一个新的异步任务:

Task {let data = await fetchData()print(data)
}

任务组

TaskGroup 可以让多个任务并行执行并等待它们的结果:

func fetchMultipleData() async {await withTaskGroup(of: String.self) { group ingroup.addTask {await fetchData()}group.addTask {await fetchData()}for await result in group {print(result) // 依次输出每个任务的结果}}
}
3. Actor:数据隔离

特性

  • Actor 自动保证线程安全,不需要手动加锁。

  • 适合在并发环境中管理共享状态。

Actor 用来确保对共享状态的安全访问。Actor 提供了一种更简单的数据同步机制,避免传统锁(locks)带来的复杂性。

actor Counter {private var value = 0func increment() {value += 1}func getValue() -> Int {return value}
}let counter = Counter()
Task {await counter.increment()print(await counter.getValue()) // 输出: 1
}
4. 结构化并发

特性

  • 通过 async let 语法启动异步任务,并确保所有任务在作用域结束时完成。

  • 避免资源泄漏和悬空任务。

确保所有异步任务在作用域结束前都能被正确完成。使用 async 函数创建的任务,通常是结构化的,意味着任务有明确的作用域和生命周期。

func structuredConcurrencyExample() async {async let data1 = fetchData()async let data2 = fetchData()let combinedData = await "\(data1), \(data2)"print(combinedData)
}
5.取消任务

Swift 的并发任务可以取消。任务需要自己检查是否已取消,以便优雅地终止。

特性

  • 任务取消是协作式的,任务需要定期检查 Task.isCancelled 以响应取消请求。
  • TaskGroup 中的任务取消也会自动取消所有子任务。
func cancellableTask() async {for i in 1...10 {if Task.isCancelled {print("任务已取消")return}print(i)try? await Task.sleep(nanoseconds: 500_000_000) // 延迟 0.5 秒}
}let task = Task {await cancellableTask()
}// 取消任务
task.cancel()
6.非阻塞的延迟:Task.sleep

特性

  • 适合在任务之间插入非阻塞的延迟。

  • 替代了传统的 sleep,不会阻塞主线程。

Task.sleep 是一种异步延迟机制,让任务可以暂停一段时间而不阻塞线程。它以纳秒为单位。

func exampleDelay() async {print("Start")try? await Task.sleep(nanoseconds: 2 * 1_000_000_000) // 延迟 2 秒print("End")
}

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

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

相关文章

说说数字化的误区

1.数字化是一把手工程 这是很多人的误区,觉得数字化要一把手参与,这样可以获得资源,权力,但是现实中这是不可能的 首先我们要明确,ceo是一把手,是负责战略的,而数字化是实实在在的战术层面的内…

MQ消息队列选型

选择合适的消息队列(Message Queue, MQ)对于构建高效、可靠、可扩展的分布式系统至关重要。以下是针对四种主流消息队列——Kafka、ActiveMQ、RabbitMQ和RocketMQ——的技术选型指南,帮助您根据项目需求做出最佳选择。 1. Kafka 适用场景&a…

基于Vue+SpringBoot的求职招聘平台

平台概述 本平台是一个高效、便捷的人才与职位匹配系统,旨在为求职者与招聘者提供一站式服务。平台内设三大核心角色:求职者、招聘者以及超级管理员,每个角色拥有独特的功能模块,确保用户能够轻松完成从信息获取到最终录用的整个…

什么是 C++ 中的初始化列表?它的作用是什么?

初始化列表是在构造函数的参数列表后面,用冒号开头,接着列出成员变量的初始化表达式。作用是在对象创建时,对成员变量进行初始化,特别是对const成员变量、引用成员变量和没有默认构造函数的成员对象,必须使用初始化列表…

谈谈Spring的常见基础概念

文章是对Spring一些基础的底层概念进行分析,后续再遇到这些问题的时候,可以采用这些步骤进行详细解释。 一.谈谈SpringIOC的理解,原理与实现? 总: 1.控制反转: (1)原来的对象是由使用者来进行控制,有了S…

openjudge_简单英文题_07:Shortest Path

题目 07:Shortest Path 总时间限制: 1000ms 内存限制: 65536kB 描述 There is a graph with N nodes. Given the length of each edge between the nodes. Find the shortest path from S to E. 输入 First line: three positive integer number N (N < 100), S (S < N…

NAT网络地址转换——Easy IP

NAT网络地址转换 Tip&#xff1a; EasylP没有地址池的概念,使用接口地址作为NAT转换的公有地址。EasylP适用于不具备固定公网IP地址的场景:如通过DHCP, PPPOE拨号获取地址的私有网络出口,可以直接使用获取到的动态地址进行转换。 本次实验模拟nat协议配置 AR1配置如下&…

oracle19c开机自启动

配置 cat > /etc/init.d/oracle19c <<EOF #!/bin/bash # Oracle startup and shutdown scriptexport ORACLE_HOME/opt/oracle/product/19c/dbhome_1 export ORACLE_SIDORCLCDB export LISTENER_NAMELISTENER # General exports and vars export PATH$ORACLE_HOME/bin…

基于xr-frame实现微信小程序的手部、手势识别3D模型叠加和石头剪刀布游戏功能

前言 xr-frame是一套小程序官方提供的XR/3D应用解决方案&#xff0c;基于混合方案实现&#xff0c;性能逼近原生、效果好、易用、强扩展、渐进式、遵循小程序开发标准。xr-frame在基础库v2.32.0开始基本稳定&#xff0c;发布为正式版&#xff0c;但仍有一些功能还在开发&#…

【WRF-Urban】URBPARM_LCZ.TBL 查找表解释及内容

【WRF-Urban】URBPARM_LCZ.TBL 查找表解释及内容 URBPARM_LCZ.TBL 文件的作用URBPARM_LCZ.TBL 文件中的参数URBPARM_LCZ.TBL 的使用URBPARM_LCZ.TBL 文件内容如何调整或扩展 URBPARM_LCZ.TBL参考URBPARM_LCZ.TBL 文件是 WRF(天气研究与预报模型) 中用于处理 局地气候区(Loca…

Odoo中,要实现实时数据推送,SSE 与 WebSocket 该如何选择

目录 1. 技术特点对比 2. 使用场景 适合使用 SSE 的场景&#xff1a; 适合使用 WebSocket 的场景&#xff1a; 3. 优缺点总结 SSE 优点&#xff1a; SSE 缺点&#xff1a; WebSocket 优点&#xff1a; WebSocket 缺点&#xff1a; 4. 选择建议 选择 SSE 的条件&#x…

服务器产品

一 存储产品 3.1 3PAR 3.2 X10000 3.3 SAN Switch 3.4 Nimble 3.5 SimpliVity 3.6 XP 3.7 MSA 3.8 StoreOnce 3.9 StoreEver 3.10 StoreBlade 3.11 StoreEasy&#xff08;WindowsNAS&#xff09; 3.12 JBOD 3.13 CB 二 服务器产品 4.1 红牌服务器 4.1.1 红牌…

nacos开启鉴权与配置加密

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Nacos漏洞复现 1.1.查看配置 1.2.查看用户列表 1.3.注册新用户 二、Nacos开启鉴权 三、变更配置与信息加密 1.变更配置 2.信息加密 四、增强安全性 五、常见问…

AI Large Language Model

AI 的 Large Language model LLM , 大语言模型&#xff1a; 是AI的模型&#xff0c;专门设计用来处理自然语言相关任务。它们通过深度学习和庞大的训练数据集&#xff0c;在理解和生成自然语言文本方面表现出色。常见的 LLM 包括 OpenAI 的 GPT 系列、Google 的 PaLM 和 Meta…

前端三剑客(二):CSS

目录 1. CSS 基础 1.1 什么是 CSS 1.2 语法格式 1.3 引入方式 1.3.1 行内样式 1.3.2 内部样式 1.3.3 外部样式 1.4 CSS 编码规范 2. 选择器 2.1 标签选择器 2.2 id 选择器 2.3 class 选择器(类选择器) 2.4 复合选择器 2.5 通配符选择器 3. 常用 CSS 样式 3.1 c…

华为Ensp模拟器配置OSPF路由协议

目录 简介 实验步骤 Pc配置 路由器配置 OSPF配置 交换机配置 简介 开放式最短路径优先 (OSPF) 协议深度解析 简介 开放式最短路径优先&#xff08;Open Shortest Path First, OSPF&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在自治系统…

【C++】绘制内存管理的地图

生活是属于每个人自己的感受&#xff0c;不属于任何人的看法。 前言 这是我自己学习C的第二篇博客总结。后期我会继续把C学习笔记开源至博客上。 上一期笔记是关于C的类与对象础知识&#xff0c;没看的同学可以过去看看&#xff1a; 【C】面向对象编程的艺术之旅-CSDN博客https…

【LC】2778. 特殊元素平方和

题目描述&#xff1a; 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。对 nums 中的元素 nums[i] 而言&#xff0c;如果 n 能够被 i 整除&#xff0c;即 n % i 0 &#xff0c;则认为 num[i] 是一个 特殊元素 。返回 nums 中所有 特殊元素 的 平方和 。 示例 1&#xff…

基于YOLOv8深度学习的医学影像骨折检测诊断系统研究与实现(PyQt5界面+数据集+训练代码)

本论文深入研究并实现了一种基于YOLOV8深度学习模型的医学影像骨折检测与诊断系统&#xff0c;旨在为医学影像中的骨折检测提供高效且准确的自动化解决方案。随着医疗影像技术的快速发展&#xff0c;临床医生需要从大量复杂的医学图像中精确、快速地识别病灶区域&#xff0c;特…

性能优化--CPU微架构

一 指令集架构 Intel X86, ARM v8, RISC-V 是当今广泛使用的指令架构的实例。 大多数现代架构可以归类为基于通用寄存器的加载和存储型架构&#xff0c;在这种架构下&#xff0c;操作数倍明确指定&#xff0c;只能使用夹在和存储指令访问内存。除提供基本的功能之外&#xff0c…