Scala中的Actor模型

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

Scala中的Actor模型

概念

Actor Model是用来编写并行计算或分布式系统的高层次抽象(类似java中的Thread)让程序员不必为多线程模式下共享锁而烦恼。Actors将状态和行为封装在一个轻量的进程/线程中,但是不和其他Actors分享状态,每个Actors有自己的世界观,当需要和其他Actors交互时,通过发送事件和消息,发送是异步的,非堵塞的(fire-andforget),发送消息后不必等另外Actors回复,也不必暂停,每个Actors有自己的消息队列,进来的消息按先来后到排列,这就有很好的并发策略和可伸缩性,可以建立性能很好的事件驱动系统。

2.12版本后,actor彻底从scala中抽离了出来,所以我们在使用前需要引入相应的lib。

<dependency>
    <groupId>com.typesafe.akka</groupId>
    <artifactId>akka-actor_2.12</artifactId>
    <version>2.5.9</version>
</dependency>

Actor的特征

  • ActorModel是消息传递模型,基本特征就是消息传递
  • 消息发送是异步的,非阻塞的
  • 消息一旦发送成功,不能修改
  • Actor之间传递时,接收消息的actor自己决定去检查消息,actor不是一直等待,是异步非阻塞的

具体写法

Actor发送接收消息
import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props

class HelloActor extends Actor {
  override def receive: Receive = {
    case "hey" => println("hey yourself")
    case _ => println("hehe")
  }
}

object Main extends App {
  val system = ActorSystem("HelloSystem")
  val helloActor = system.actorOf(Props[HelloActor], name = "helloActor")
  helloActor ! "hey"
  helloActor ! "good morning"
}
Actor与Actor之间通信
import akka.actor.{Actor, ActorRef, ActorSystem, Props}

class MyActor extends Actor {
  override def receive: Receive = {
    case msg: String => {
      println(msg)
      Thread.sleep(1000)
      sender() ! "你说啥"
    }
    case Int => println("你竟然说数字")
    case _ => println("default")
  }
}
class MyActor2 extends Actor {
  private val other: ActorRef = context.actorOf(Props(new MyActor), "actor1child")
  override def receive: Receive = {
    case msg: String => {
      println(msg)
      other ! "nihao"
    }
  }
}
object Test extends App {
  private val system: ActorSystem = ActorSystem("system")
  private val actor: ActorRef = system.actorOf(Props(new MyActor2), "actor1")
  actor ! "你好actor2"
}

综述

Scala 中的 Actor 模型是一种并发编程模型,用于处理并发和并行计算。Actor 模型的核心概念是基于消息传递和非共享状态,并通过轻量级的执行单元(称为 Actor)来实现并发和协作。

在 Scala 中,可以使用 Akka 框架来实现 Actor 模型。Akka 是一个构建可扩展、高性能和弹性系统的工具包,它提供了强大的 Actor 模型库。

下面是一些关于 Scala 中 Actor 模型的基本概念和用法:

  1. Actor 的创建和消息传递:
import akka.actor.{Actor, ActorSystem, Props}

class MyActor extends Actor {
  def receive: Receive = {
    case message: String =>
      println(s"Received message: $message")
  }
}

val system = ActorSystem("MySystem")
val myActor = system.actorOf(Props[MyActor], "myActor")

myActor ! "Hello"

在上述示例中,我们定义了一个 MyActor 类,它继承自 Actor 并重写了 receive 方法来处理消息。通过 ActorSystemProps,我们创建了一个名为 “MySystem” 的 Actor 系统,并创建了一个名为 “myActor” 的 Actor 实例。然后,我们通过 ! 运算符向 myActor 发送了一条消息 “Hello”。

  1. Actor 之间的相互协作:
class GreetingActor extends Actor {
  def receive: Receive = {
    case message: String =>
      val senderActor = sender()
      println(s"GreetingActor received message: $message")
      senderActor ! "Nice to meet you"
  }
}

val greetingActor = system.actorOf(Props[GreetingActor], "greetingActor")
val response = myActor.ask("How are you?")(timeout = Timeout(5.seconds)).mapTo[String]

response.onComplete {
  case Success(message) => println(s"Response: $message")
  case Failure(ex) => println(s"Failed: ${ex.getMessage}")
}

在上述示例中,我们创建了一个 GreetingActor 类,它也是一个 Actor。在 receive 方法中,它接受到消息后会打印出接收到的消息,并通过 sender() 方法获取发送消息的 Actor,并向其发送一条回复消息。

在主程序中,我们使用 ask 方法向 myActor 发送一个问候消息并等待回复。通过 mapTo 方法,将回复消息转换为字符串类型,并使用 onComplete 处理回复结果。

总之,Scala 中的 Actor 模型提供了一种高效且易于编写并发代码的方式。Akka 框架为 Scala 提供了完善的 Actor 模型实现,使我们能够轻松构建并发和并行计算应用程序。文章来源地址https://www.toymoban.com/news/detail-689687.html

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

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

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

相关文章

  • 【spark】java类在spark中的传递,scala object在spark中的传递

    记录一个比较典型的问题,先讲一下背景,有这么一个用java写的类 然后在spark中使用的时候: 原因: scala的object对应的就是java的静态成员,可以反过来理解java的所有静态成员可被抽取成伴生对象(虽然现实中是scala最终编译成java)。以上面的JavaClass0 例子可理解为等价的

    2024年02月11日
    浏览(39)
  • 编写 Scala 工程代码,将 MySQL 库中的表增量抽取到 Hive库中对应表中

    提示:本文采用IDEA编写代码 搭建好spark,推荐一篇较好的文章:spark3.3.0安装部署过程。 注:如果需要运行 yarn 模式,在 spark-env.sh 文件末尾添加: export YARN_CONF_DIR=/opt/hadoop-3.1.3/etc/hadoop export HADOOP_CONF_DIR=/opt/hadoop-3.1.3/etc/hadoop 搭建完spark 集群 后,在spark的 jars 目录下放入mys

    2023年04月14日
    浏览(70)
  • Scala 02——Scala OOP

    前序 为什么说Scala是 纯粹的 OOP? 不支持基本类型,一切皆为对象:Byte,Int… Scala会将基本类型视为对象,还是在JVM上运行,自动与Java的基本数据类型完成拆装箱的操作。 不支持静态:static Java和Scala的 静态 概念的区别 Java Java的静态成员:在Java中,静态成员(属性或方

    2024年04月26日
    浏览(49)
  • Scala入门,idea关联Scala

    创建maven项目 配置maven仓库 添加Scala插件 添加相关依赖 添加scala的SDK 需要将其提前安装好:安装Scala 创建Scala文件 阶乘 素数 列表中最大的数 计算列表中所有的和 遍历列表 判断天气 九九乘法表 Scala的类可以使用class类定义,用法与 Java 类定义相似。类可以包含成员变

    2024年02月11日
    浏览(45)
  • Scala 04 —— Scala Puzzle 拓展

    一、占位符 在上面的例子中,两代码的返回结果其实是一样的,都是 List(2,3,4) ,而在第一行中的 _ 叫做占位符,可以让我们的代码更加简洁 但是这并不意味着使用 _ 和箭头函数是同样的结果 在上面的代码中,看起来运行的结果还是一样的,但是事实却不是这样的,当然 lis

    2024年04月27日
    浏览(47)
  • 【Scala入门】Scala下载及安装(Windows)以及Idea创建第一个scala项目

    目录 一、安装准备 二、Scala下载安装 三、Idea 创建Scala项目 在安装之前,确保你的电脑上装有Jdk 8(Jdk 1.8),且环境变量配置正确。如果没有安装Jdk,请参照其他文章先安装Jdk 8(Jdk 1.8)。 (1)确认环境变量方法:使用Win + R 快捷键调出下面窗口,输入“cmd”,按下回车。

    2024年02月05日
    浏览(53)
  • 大数据开发语言Scala(一)——scala入门

    累了,基础配置不想写了,直接抄了→Scala的环境搭建 这里需要注意的是,创建新项目时,不要用默认的Class类,用Object,原因看→scala中的object为什么可以直接运行 package : 包,等同于java中的package object :,声明一个单例对象(伴生对象) main方法 :从外部可以直接

    2024年02月05日
    浏览(58)
  • Windows下安装Scala(以Scala 2.11.12为例)

    Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言、并集成面向对象编程和函数式编程的各种特性。Scala是一种纯粹的面向对象语言,因为每个值都是一个对象。对象的类型和行为由类和特征描述。类可以通过子类化和使用灵活的基于mixi

    2024年02月03日
    浏览(41)
  • 你知道Scala编程语言吗?Scala基础教程【建议收藏】

    作者:i阿极 作者简介:Python领域新星作者、多项比赛获奖者:博主个人首页 😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍 📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪 Scala是一种

    2023年04月08日
    浏览(83)
  • Spring Boot进阶(77):开启Scala之门:用Spring Boot轻松整合Scala

            Scala是一种基于JVM的编程语言,它融合了面向对象编程和函数式编程的优点,同时也具有强大的类型推断能力和高阶函数等先进特性,因此在企业级应用开发中得到了广泛的应用。         Spring Boot是一个快速开发框架,它的宗旨是使Spring应用程序的开发变得更

    2024年02月08日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包