详解Swift中 Sendable AnyActor Actor GlobalActor MainActor Task、await、async

news2025/2/11 3:39:51

详解Swift中 Sendable AnyActor Actor GlobalActor MainActor 的关联或者关系 及其 各自的作用 和 用法 以及与 Task、await、async:

  1. Sendable 协议
    作用:
    Sendable 是一个协议,它用于标记可以安全地跨线程或异步任务传递的数据类型。符合 Sendable 协议的类型可以在并发环境中被安全地传递,避免因数据竞争而产生的问题。

使用场景:
如果你希望将某个对象安全地传递给其他任务(如 Task),那么这个对象就必须符合 Sendable 协议。
在并发环境下,Swift 会确保 Sendable 类型的对象不会在多个线程之间产生数据竞争。
示例:

struct MyStruct: Sendable {
    var value: Int
}

在上面的例子中,MyStruct 遵循了 Sendable 协议,因此它可以被安全地传递给多个并发任务。

Sendable 与 Task、async、await 的关系:
Task 会在不同的并发上下文中执行。如果你需要将某些数据从一个任务传递到另一个任务中,这些数据就需要符合 Sendable 协议。
await 和 async 会创建异步任务,如果传递的数据不符合 Sendable,编译器会报错,提示数据类型不是可发送的。

  1. Actor 类型
    作用:
    Actor 是一种新的引用类型,专门用于确保在并发环境中的数据安全。Actor 通过序列化对其内部状态的访问来避免数据竞争。它通过自动同步访问来保证多线程环境中的线程安全。

使用场景:
Actor 主要用于封装需要在并发环境下访问的状态或数据,它确保数据不会被多个线程同时修改。
Actor 会保护其内部状态,所有对 Actor 内部数据的访问都会被序列化,因此可以避免数据竞态和不一致的状态。
示例:

actor Counter {
    private var value = 0
    
    func increment() {
        value += 1
    }
    
    func getValue() -> Int {
        return value
    }
}

let counter = Counter()
Task {
    await counter.increment()
    let currentValue = await counter.getValue()
    print(currentValue)
}

Actor 与 Sendable 的关系:
Actor 本身是 线程安全 的,但如果 Actor 内部持有非 Sendable 类型的对象,它就不能跨线程或任务传递该对象。
如果你将 Actor 的实例作为任务的一部分进行传递,它需要符合 Sendable 协议,这意味着 Actor 中的所有状态和数据也需要是 Sendable 的。

  1. AnyActor 类型
    作用:
    AnyActor 是一个类型擦除的包装器,允许你将某个具体的 Actor 类型转为通用的 Actor 类型。它通常用于在无法预先知道具体 Actor 类型的场景中,或者当你需要在函数或方法中处理不同类型的 Actor 时。

使用场景:
当你需要处理多个不同类型的 Actor,并且无法在编译时确定具体的类型时,AnyActor 就非常有用。
示例:

actor MyActor {
    var value: Int = 0
}

func performAction(actor: AnyActor) {
    // 对 AnyActor 做一些操作
}
  1. GlobalActor 协议
    作用:
    GlobalActor 是一个协议,它允许你为全局共享的并发环境(如主线程或后台线程)指定一个特定的执行上下文。通过 GlobalActor,你可以确保某些代码始终在特定的线程或调度队列上执行。

使用场景:
例如,MainActor 是一个 GlobalActor,它确保某些代码在 主线程 上执行,通常用于 UI 更新操作。
示例:

@globalActor
struct MainActor: GlobalActor {
    static let shared = MainActor()
}

@MainActor
func updateUI() {
    // 此方法会在主线程上执行
}
  1. MainActor 类型
    作用:
    MainActor 是一个特殊的 GlobalActor,它确保标记的代码总是在主线程上执行。由于 UI 更新通常必须在主线程上进行,因此 MainActor 主要用于确保 UI 更新代码运行在主线程。

使用场景:
UI更新:在 SwiftUI 或 UIKit 中,需要确保界面更新代码运行在主线程,因此可以用 @MainActor 属性来标记这些方法。
示例:

@MainActor
func updateUI() {
    // 只有在主线程中执行
    print("UI is updated!")
}

Task {
    await updateUI() // 确保在主线程执行
}

Task、async 和 await 与上述概念的关系
async 和 await:async 用于标记异步函数,await 用于等待异步函数的结果。在并发环境中,你可以通过 async 和 await 来执行任务,而不阻塞线程。

Task:Task 用于创建一个并发任务,它允许你在后台执行异步代码。你可以通过 Task 来启动异步代码并使用 await 来等待它的结果。

Actor 和 MainActor:当你在 Task 中使用 await 时,如果你的任务需要访问某个 Actor 类型的数据,确保你使用正确的并发上下文。例如,访问 UI 相关的状态时,要确保它在主线程上执行,可以使用 @MainActor 标记。

综合示例:

@MainActor
actor ViewModel {
    var data: String = "Hello"

    func updateData() {
        data = "Updated"
        print("Data updated on the main thread")
    }
}

func performAsyncWork() async {
    let viewModel = ViewModel()
    await viewModel.updateData() // 在主线程执行
}

Task {
    await performAsyncWork()
}

总结:
Sendable 是用于标记可以安全地传递的数据类型。
Actor 用于封装并发访问的对象,保证数据安全。
AnyActor 用于类型擦除,使得不同类型的 Actor 可以通用处理。
GlobalActor 和 MainActor 用于指定代码执行的全局并发上下文,确保代码在特定的线程上执行。
Task、async 和 await 用于创建和管理异步任务。

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

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

相关文章

【C语言标准库函数】浮点数分解与构造: frexp() 和 ldexp()

目录 一、头文件 二、函数简介 2.1. frexp(double x, int *exp) 2.2. ldexp(double x, int exp) 三、函数实现(概念性) 3.1. frexp 的概念性实现 3.2. ldexp 的概念性实现 四、注意事项 五、示例代码 在C语言标准库中,frexp() 和 ld…

【Git】tortoisegit使用配置

1. 安装 首先下载小乌龟,下载地址:https://tortoisegit.org/download/, 可以顺便下载语言包! 安装时,默认安装就可以,一路next。也可以安装到指定目录中 目前已完成本地安装,接下来就需要与远程仓库建立连接&…

Spring基于文心一言API使用的大模型

有时做项目我们可能会遇到要在项目中对接AI大模型 本篇文章是对使用文心一言大模型的使用总结 前置任务 在百度智能云开放平台中注册成为开发者 百度智能云开放平台 进入百度智能云官网进行登录,点击立即体验 点击千帆大模型平台 向下滑动,进入到模型…

Centos Ollama + Deepseek-r1+Chatbox运行环境搭建

Centos Ollama Deepseek-r1Chatbox运行环境搭建 内容介绍下载ollama在Ollama运行DeepSeek-r1模型使用chatbox连接ollama api 内容介绍 你好! 这篇文章简单讲述一下如何在linux环境搭建 Ollama Deepseek-r1。并在本地安装的Chatbox中进行远程调用 下载ollama 登…

SpringSecurity:授权服务器与客户端应用(入门案例)

文章目录 一、需求概述二、开发授权服务器1、pom依赖2、yml配置3、启动服务端 三、开发客户端应用1、pom依赖2、yml配置3、SecurityConfig4、接口5、测试 一、需求概述 maven需要3.6.0以上版本 二、开发授权服务器 1、pom依赖 <dependency><groupId>org.springfr…

Python与java的区别

一开始接触Python的时候&#xff0c;哔哩视频铺天盖地&#xff0c;看了很多人主讲的&#xff0c;要找适合自己口味的&#xff0c;各种培训机构喜欢在各种平台引流打广告&#xff0c;看了很多家&#xff0c;要么就是一个视频几个小时&#xff0c;长篇大论不讲原理只讲应用&#…

大数据学习之SparkSql

95.SPARKSQL_简介 网址&#xff1a; https://spark.apache.org/sql/ Spark SQL 是 Spark 的一个模块&#xff0c;用于处理 结构化的数据 。 SparkSQL 特点 1 易整合 无缝的整合了 SQL 查询和 Spark 编程&#xff0c;随时用 SQL 或 DataFrame API 处理结构化数据。并且支…

鸿蒙UI(ArkUI-方舟UI框架)- 使用文本

返回主章节 → 鸿蒙UI&#xff08;ArkUI-方舟UI框架&#xff09; 文本使用 文本显示 (Text/Span) Text是文本组件&#xff0c;通常用于展示用户视图&#xff0c;如显示文章的文字内容。Span则用于呈现显示行内文本。 创建文本 string字符串 Text("我是一段文本"…

Spider 数据集上实现nlp2sql训练任务

NLP2SQL&#xff08;自然语言处理到 SQL 查询的转换&#xff09;是一个重要的自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;其目标是将用户的自然语言问题转换为相应的 SQL 查询。这一任务在许多场景下具有广泛的应用&#xff0c;尤其是在与数据库交互的场景中&…

【DeepSeek】DeepSeek概述 | 本地部署deepseek

目录 1 -> 概述 1.1 -> 技术特点 1.2 -> 模型发布 1.3 -> 应用领域 1.4 -> 优势与影响 2 -> 本地部署 2.1 -> 安装ollama 2.2 -> 部署deepseek-r1模型 1 -> 概述 DeepSeek是由中国的深度求索公司开发的一系列人工智能模型&#xff0c;以其…

ASP.NET Core 使用 WebClient 从 URL 下载

本文使用 ASP .NET Core 3.1&#xff0c;但它在.NET 5、 .NET 6和.NET 8上也同样适用。如果使用较旧的.NET Framework&#xff0c;请参阅本文&#xff0c;不过&#xff0c;变化不大。 如果想要从 URL 下载任何数据类型&#xff0c;请参阅本文&#xff1a;HttpClient 使用WebC…

【CubeMX-HAL库】STM32F407—无刷电机学习笔记

目录 简介&#xff1a; 学习资料&#xff1a; 跳转目录&#xff1a; 一、工程创建 二、板载LED 三、用户按键 四、蜂鸣器 1.完整IO控制代码 五、TFT彩屏驱动 六、ADC多通道 1.通道确认 2.CubeMX配置 ①开启对应的ADC通道 ②选择规则组通道 ③开启DMA ④开启ADC…

vue3 点击图标从相册选择二维码图片,并使用jsqr解析二维码(含crypto-js加密解密过程)

vue3 点击图标从相册选择二维码图片&#xff0c;并使用jsqr解析二维码&#xff08;含crypto-js加密解密过程&#xff09; 1.安装 jsqr 和 crypto-js npm install -d jsqr npm install crypto-js2.在util目录下新建encryptionHelper.js文件&#xff0c;写加密解密方法。 // e…

kafka 3.5.0 raft协议安装

前言 最近做项目&#xff0c;需要使用kafka进行通信&#xff0c;且只能使用kafka&#xff0c;笔者没有测试集群&#xff0c;就自己搭建了kafka集群&#xff0c;实际上笔者在很早之前就搭建了&#xff0c;因为当时还是zookeeper&#xff08;简称ZK&#xff09;注册元数据&#…

前后端服务配置

1、安装虚拟机&#xff08;VirtualBox或者vmware&#xff09;&#xff0c;在虚拟机上配置centos(选择你需要的Linux版本)&#xff0c;配置如nginx服务器等 1.1 VMware 下载路径Sign In注册下载 1.2 VirtualBox 下载路径https://www.virtualbox.org/wiki/Downloads 2、配置服…

在阿里云ECS上一键部署DeepSeek-R1

DeepSeek-R1 是一款开源模型&#xff0c;也提供了 API(接口)调用方式。据 DeepSeek介绍&#xff0c;DeepSeek-R1 后训练阶段大规模使用了强化学习技术&#xff0c;在只有极少标注数据的情况下提升了模型推理能力&#xff0c;该模型性能对标 OpenAl o1 正式版。DeepSeek-R1 推出…

git SourceTree 使用

Source Tree 使用原理 文件的状态 创建仓库和提交 验证 再克隆的时候发发现一个问题&#xff0c;就是有一个 这个验证&#xff0c;起始很简单 就是 gitee 的账号和密码&#xff0c;但是要搞清楚的是账号不是名称&#xff0c;我之前一直再使用名称登录老是出问题 这个很简单的…

游戏引擎学习第94天

仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾上周的渲染器工作 完成一款游戏的开发&#xff0c;完全不依赖任何库和引擎&#xff0c;这样我们能够全面掌握游戏的开发过程&#xff0c;确保没有任何细节被隐藏。我们将深入探索每一个环节&#xff0c;犹如拿着手电筒翻看床…

win32汇编环境,结构体的使用示例二

;运行效果 ;win32汇编环境,结构体的使用示例二 ;举例说明结构体的定义&#xff0c;如何访问其中的成员&#xff0c;使用assume指令指向某个结构体&#xff0c;计算结构数组所需的偏移量得到某个成员值等 ;直接抄进RadAsm可编译运行。重要部分加备注。 ;下面为asm文件 ;>>…

DeepSeek从入门到精通教程PDF清华大学出版

DeepSeek爆火以来&#xff0c;各种应用方式层出不穷&#xff0c;对于很多人来说&#xff0c;还是特别模糊&#xff0c;有种雾里看花水中望月的感觉。 最近&#xff0c;清华大学新闻与传播学院新媒体研究中心&#xff0c;推出了一篇DeepSeek的使用教程&#xff0c;从最基础的是…