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

这篇具有很好参考价值的文章主要介绍了Rust 中 Actor 并发模型的实践与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

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 的基本结构如下所示:文章来源地址https://www.toymoban.com/news/detail-861376.html

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);
            }

到了这里,关于Rust 中 Actor 并发模型的实践与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Rust 指南】并发编程|无畏并发的原因

       安全高效的处理并发是 Rust 诞生的目的之一,主要解决的是服务器高负载承受能力。 并发 ( concurrent )的概念是指程序不同的部分 独立执行 ,这与 并行 ( parallel )的概念容易混淆,并行强调的是\\\"

    2023年04月08日
    浏览(41)
  • Rust 并发

    thread::spawn() 创建新线程 参数是一个闭包,新线程执行的代码 当主线程结束时,不管其他子线程是否结束,都会结束所有的子线程 可以使用 join()方法,等待子线程执行完 thread::spawn()会返回 joint_handler 从一个线程中,将所有权转移到另一个线程中 channel mpsc ::channel(多个生产者

    2024年01月23日
    浏览(24)
  • Rust基础拾遗--并发和异步编程

       通过 Rust程序设计-第二版 笔记的形式对Rust相关 重点知识 进行汇总,读者通读此系列文章就可以轻松的把该语言基础捡起来。 为什么一些看似正确的多线程惯用法却根本不起作用? 与“内存模型”有关 你最终会找到一种自己用起来顺手且不会经常出错的并发惯用法。

    2024年02月19日
    浏览(35)
  • 没有synchronized,rust怎么防并发?

    学过Java的同学对synchronized肯定不陌生,那么rust里怎么办呢? 在Rust中,可以使用标准库提供的 std::sync::Mutex 来实现加锁功能。Mutex是互斥锁的一种实现,用于保护共享数据在并发访问时的安全性。 下面是一个简单的示例代码,展示了如何在Rust中使用Mutex进行加锁: 在上述代

    2024年02月13日
    浏览(30)
  • Rust编程语言入门之无畏并发

    Concurrent:程序的不同部分之间独立的执行(并发) Parallel:程序的不同部分同时运行(并行) Rust无畏并发:允许你编写没有细微Bug的代码,并在不引入新Bug的情况下易于重构 注意:本文中的”并发“泛指 concurrent 和 parallel 在大部分OS里,代码运行在进程(process)中,OS同时

    2023年04月19日
    浏览(68)
  • 【跟小嘉学 Rust 编程】十六、无畏并发(Fearless Concurrency)

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学 Rust 编程】六、枚举

    2024年02月11日
    浏览(38)
  • Rust安全编码实践 Secure Coding Practices in Rust

    作者:禅与计算机程序设计艺术 Rust编程语言被称为可保证内存安全的系统编程语言,它在编译期间通过类型系统确保数据不出错。因此,Rust语言开发者需要掌握一些安全编码实践,如内存安全、访问控制、输入验证等。本文将对这些安全编码实践进行详细介绍,并结合Rus

    2024年02月04日
    浏览(40)
  • rust 自动化测试、迭代器与闭包、智能指针、无畏并发

    编写测试可以让我们的代码在后续迭代过程中不出现功能性缺陷问题;理解迭代器、闭包的函数式编程特性; BoxT 智能指针在堆上存储数据, RcT 智能指针开启多所有权模式等;理解并发,如何安全的使用线程,共享数据。 编写测试以方便我们在后续的迭代过程中,不会改坏

    2024年02月16日
    浏览(38)
  • 用Rust设计一个并发的Web服务:常用Rust库如Tokio、Hyper等,基于TCP/IP协议栈,实现了一个简单的并发Web服务器,并结合具体的代码讲解如何编写并发Web服务器的程序

    作者:禅与计算机程序设计艺术 1994年,互联网泡沫破裂,一批优秀的程序员、工程师纷纷加入到web开发领域。而其中的Rust语言却备受瞩目,它是一种现代系统编程语言,专注于安全和并发。因此,Rust在当下成为最流行的编程语言之一,很多框架也开始使用Rust重构,这使得

    2024年02月06日
    浏览(58)
  • Rust 是一种面向系统编程语言 主要被设计用来解决执行速度、安全性、并发性和可靠性等方面的问题 Rust From First Principles: Building a Minimal Rust

    作者:禅与计算机程序设计艺术 Rust 是一种面向系统编程语言,主要被设计用来解决执行速度、安全性、并发性和可靠性等方面的问题。相比于其他语言来说,它拥有以下优点: 高性能: Rust 的运行时是单线程的,但是拥有基于垃圾收集(GC)的自动内存管理机制,使得在开

    2024年02月07日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包