Rust 中 Actor 并发模型的实践与使用

server/2024/10/18 12:30:07/

简介

Actor 模型是一种并行计算模型,提供了一种用于构建并发、分布式系统的形象办法。在 Actor 模型中,计算被示意为独立的、轻量级的计算单元,称为 Actor,能够发送和接管音讯并进行本地计算。

作为一种通用的消息传递编程模型,被广泛用于构建大规模可伸缩分布式系统。其核心思想是独立保护隔离状态,并基于消息传递实现异步通信。

Actor 模型组成

  • 存储:每个 Actor 持有一个邮箱(mailbox),实质上是一个队列,用于存储音讯。
  • 通信:每个 Actor 能够发送音讯至任何 Actor,应用异步消息传递,不保障音讯达到指标 Actor 时的程序。
  • 计算Actor 能够通过解决音讯来更新外部状态,对于内部而言,Actor 的状态是隔离的isolated state

优劣势

  • 每个 Actor 独立运行,因而程序天然是并行的
  • 每个 Actor 都齐全独立于其余实例,不存在共享内存和竞争条件的问题,能够防止并发编程中的一些难点
  • 通过消息传递进行通信,每个 Actor 都有一个邮箱来接管音讯,每次只解决一个音讯,以确保状态的一致性和线程平安
  • 消息传递是异步的,发送方不须要期待接管方的响应,从而防止了锁和同步的开销
  • 提供高度的并发性和可扩展性,可能无效地解决多核 CPU 和分布式系统中的并发编程问题
  • 提供良好的容错性和可恢复性,因为每个 Actor 都有本人的状态和行为,能够更容易地实现零碎的容错和复原

Actor 模型的实现方式

Actor 基于线程的任务调度

为每一个 Actor 调配一个独立的执行过程(线程),独占该线程,能够是操作系统线程,协程或者虚拟机线程。如果以后 Actor 的邮箱为空,Actor 会阻塞以后线程,期待接管新的音讯。

因为线程数量受到系统资源零碎的限度,因而 Actor 的数量也会受到限制。

Actor 基于事件驱动的任务调度

只有在事件触发(即接管音讯)时,才为 Actor 的任务分配线程并执行,当事件处理完毕,即退出线程。该形式能够应用很少的线程来执行大量 Actor 产生的工作,也是当初大部分 Actor 模型所采纳的调度形式

这种实现与 run loopevent loop 机制十分类似

  • 如下示例了三种方式的 Actor 系统示例:
    • 使用 Tokio 实现 Actor 系统
    • Actor 模型实现 之 actix 框架
    • Actor 模型实现 之 ghost_actor 框架

使用 Tokio 实现 Actor 系统

Actor 分为两部分:任务 Taskhandle。 该任务是独立生成的Tokio任务,实际上执行 Actor 的职责,而 handle 是一种允许你与该任务进行通信的结构。

​ 让我们考虑一个简单的 Actor 。 Actor 在内部存储一个计数器,该计数器用于获取某种唯一ID。 Actor 的基本结构如下所示:

rust">use tokio::sync::{oneshot, mpsc};struct MyActor {receiver: mpsc::Receiver<ActorMessage>,next_id: u32,
}
enum ActorMessage {GetUniqueId {respond_to: oneshot::Sender<u32>,},
}impl MyActor {fn new(receiver: mpsc::Receiver<ActorMessage>) -> Self {MyActor {receiver,next_id: 0,}}fn handle_message(&mut self, msg: ActorMessage) {match msg {ActorMessage::GetUniqueId { respond_to } => {self.next_id += 1;// The `let _ =` ignores any errors when sending.// `let _ =` 忽略了发送的任何 error// This can happen if the `select!` macro is used// to cancel waiting for the response.// 当 `select!` 宏被用到时将会停止接受响应let _ = respond_to.send(self.next_id);}

http://www.ppmy.cn/server/7984.html

相关文章

第15届蓝桥杯题解

A题 结果&#xff1a;2429042904288 思路很简单 前20个数分别是 20 24 40 48 60 72 80 96 100 120 140 144 160 168 180 192 200 216 220 240 第2 4 6 8 12 ...n个数分别是24的 1倍 2倍 3倍 4倍 6倍 n/2倍 所以第202420242024 个数就是 24的 101210121012倍 B题 答案&am…

【配电网故障定位】基于二进制蝙蝠算法的配电网故障定位 33节点配电系统故障定位【Matlab代码#80】

文章目录 【获取资源请见文章第6节&#xff1a;资源获取】1. 配电网故障定位2. 二进制蝙蝠算法3. 算例展示4. 部分代码展示5. 仿真结果展示6. 资源获取 【获取资源请见文章第6节&#xff1a;资源获取】 1. 配电网故障定位 配电系统故障定位&#xff0c;即在配电网络发生故障的…

JMeter组件--配置元件--JSON断言

JSON断言&#xff08;JSON Assertion&#xff09; 可以对 Jmeter 取样器的响应消息以 JSON 方式进行检查&#xff1b;检测响应报文返回的特征值&#xff0c;进而判断取样器在业务上是否正确&#xff1b; 右键 >>> 添加 >>> 断言 >>> JSON断言&…

跨平台SIP 客户端-linphone下载、使用、开启视频H264

linphone 介绍 Linphone 是一种开源的语音和视频通信应用程序&#xff0c;它提供了基于互联网协议&#xff08;IP&#xff09;的实时通信功能。用于语音/视频通话、即时消息和电话会议的开源 SIP 电话。它适用于移动和桌面环境&#xff08;iOS、Android、GNU/Linux、macOS、Win…

性能监控数据(本地、服务器)

CPU、内存、磁盘等的监控 一、mac本地性能监控 1. top 终端&#xff1a; top load Avg: 平均负载(1分钟&#xff0c;5 分钟&#xff0c;15 分钟)值不能超过 4&#xff0c;要不然就是超负荷运行 Tasks: 进程数 %Cpu(s): idle :剩余百分比 KiB Mem: free:剩余内存&#xff0…

上海人工智能实验室的书生·浦语大模型学习笔记(第二期第四课——上篇)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型&#xff0c;这次有机会参与试用&#xff0c;特记录每日学习情况。 今天就ddl&#xff0c;但这次学习的内容太多&#xff0c;需要很长时间去消化&#xff0c;要抓紧最后时间&#xff0c;不然来不及了 这次记录的是…

数字技术重塑产业园区管理与服务:数字园区引领产业实现智能化发展新纪元

目录 一、引言 二、数字技术重塑产业园区管理与服务 1、智能化管理提升效率 2、数字化服务优化体验 三、数字园区引领产业实现智能化发展新纪元 1、产业智能化升级 2、创新资源汇聚 3、产业链协同优化 四、数字园区的挑战与对策 五、结论与展望 六、结语 一、引言 …

ExpertPrompting:指导大语言模型成为杰出专家

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题&#xff1a;ExpertPrompting: Instructing Large Language Models to be Distinguished Experts 论文地址&#xff1a;https://arxiv.org/abs/2305.14688 作者 & 机构&#xff1a;Benfen…