Scala--- Actor通信模型

一、概念理解

1、Java中的并发编程

Java中的并发编程是基于共享数据和加锁的一种机制,即会有一个共享的数据,然后有若干个线程去访问这个共享的数据(主要是对这个共享的数据进行修改),同时Java利用加锁的机制(即synchronized)来确保同一时间只有一个线程对我们的共享数据进行访问,进而保证共享数据的一致性。Java中的并发编程存在资源争夺和死锁等多种问题,因此程序越大问题越麻烦。

2、Scala中的并发编程

Scala中的并发编程思想与Java中的并发编程思想完全不一样,Scala中的Actor是一种不共享数据,依赖于消息传递的一种并发编程模式, 避免了死锁、资源争夺等情况。在具体实现的过程中,Scala中的Actor会不断的循环自己的邮箱,并通过receive偏函数进行消息的模式匹配并进行相应的处理。

如果Actor A和 Actor B要相互沟通的话,首先A要给B传递一个消息,B会有一个收件箱,然后B会不断的循环自己的收件箱, 若看见A发过来的消息,B就会解析A的消息并执行,处理完之后就有可能将处理的结果通过邮件的方式发送给A。

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

Actor的特征:

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

什么是Akka

Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和Scala 的 Actor 模型应用,底层实现就是Actor,Akka是一个开发库和运行环境,可以用于构建高并发、分布式、可容错、事件驱动的基于JVM的应用。使构建高并发的分布式应用更加容易。

spark1.6版本之前,spark分布式节点之间的消息传递使用的就是Akka,底层也就是actor实现的。1.6之后使用的netty传输。

二、例:Actor简单例子发送接收消息

1.import scala.actors.Actor
2.
3.class myActor extends Actor{
4.
5.  def act(){
6.    while(true){
7.      receive {
8.        case x:String => println("get String ="+ x)
9.        case x:Int => println("get Int")
10.        case _ => println("get default")
11.      }
12.    }
13.  }
14.}
15.
16.object Lesson_Actor {
17.  def main(args: Array[String]): Unit = {
18.
19.    //创建actor的消息接收和传递
20.    val actor =new myActor()
21.    //启动
22.    actor.start()
23.    //发送消息写法
24.    actor ! "i love you !"
25.
26.  }
27.}

三、例:Actor与Actor之间通信

1.case class Message(actor:Actor,msg:Any)
2.
3.class Actor1 extends Actor{
4.  def act(){
5.    while(true){
6.      receive{
7.        case msg :Message => {
8.          println("i sava msg! = "+ msg.msg)
9.
10.          msg.actor!"i love you too !"
11.        }
12.        case msg :String => println(msg)
13.        case _ => println("default msg!")
14.      }
15.    }
16.  }
17.}
18.
19.class Actor2(actor :Actor) extends Actor{
20.  actor ! Message(this,"i love you !")
21.  def act(){
22.    while(true){
23.      receive{
24.        case msg :String => {
25.         if(msg.equals("i love you too !")){
26.            println(msg)
27.            actor! "could we have a date !"
28.         }
29.        }
30.        case _ => println("default msg!")
31.      }
32.    }
33.  }
34.}
35.
36.object Lesson_Actor2 {
37.  def main(args: Array[String]): Unit = {
38.    val actor1 = new Actor1()
39.    actor1.start()
40.    val actor2 = new Actor2(actor1)
41.    actor2.start()
42.  }
43.}

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

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

相关文章

98.qt qml-使用曲线图综合示例、支持多种鼠标交互、支持百万数据显示(已适配黑白风格)

在上章我们只是简单实现了曲线图和折线图的显示: 79.qt qml-如何在QML中使用QCustomPlot之曲线/折线示例(已适配黑白风格)_qml 折线图_诺谦的博客-CSDN博客 所以本章实现综合示例、并添加多种功能如下所示: 详细显示:鼠标任意移动显示具体值内容鼠标右击: 弹出菜单栏,支持…

记一次解决Pyqt6/Pyside6添加QTreeView或QTreeWidget导致窗口卡死(未响应)的新路历程,打死我都想不到是这个原因

文章目录 💢 问题 💢🏡 环境 🏡📄 代码💯 解决方案 💯⚓️ 相关链接 ⚓️💢 问题 💢 我在窗口中添加了一个 QTreeWidget控件 ,但是程序在运行期间,只要鼠标进入到 QTreeWidget控件 内进行操作,时间超过几秒中就会出现窗口 未响应卡死的 状态 🏡 环境 �…

智慧校园烟火识别及预警解决方案,保障校园消防安全

一、方案背景 校园消防安全一直以来是社会各界备受关注的问题。为了保障师生的人身安全和财产安全,越来越多的学校开始引入AI智能检测技术,通过运用AI智能烟火检测技术,对学校的周界、教室、走廊、公共区域、教学楼、食堂等场所进行安全监测…

世微 电动车摩托车灯 5-80V 1.2A 一切二降压恒流驱动器AP2915

产品描述 AP2915 是一款可以一路灯串切换两路灯串的降压恒流驱动器,高效率、外围简单、内置功率管,适用于5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功率管输出最大功率可达 12W,最大电流 1.2A。AP2915 一路灯亮切换两路灯亮,其中一路灯…

【c#】使用Prometheus监控Windows系统

Prometheus 监控Windows机器 1.Prometheus 简单介绍 Prometheus 是一个开源的系统监控和报警工具包,最初建立在 SoundCloud 之上。自 2012 年成立以来,许多公司和组织都采用了 Prometheus,它拥有非常活跃的开发者和用户社区。现在是一个独立的开源项目,独立于任何…

Leetcode 153. 寻找旋转排序数组中的最小值

class Solution {//因为最小值和最大值总是相邻的(除了初始状态)//1.用二分查找,如果右侧是有序则最小值在左侧//2.如果右侧无序则最小值在右侧//如果mid正好是最小值,那么右侧自然是有序的,//为了将mid加入到搜索的一…

你想对构造函数说些什么?

回顾知识 在学习类的默认成员函数之前,先带大家复习一下什么是类,类是在C中引进的新的类型,是一种自定义类型,实际上跟C语言中的结构体类似,但是是对结构体的升级,可以在类里面添加函数,也有对应…

借駐conda安裝evo

代碼如下: conda create -n evo python3.8 conda activate evo pip install evo --upgrade --no-binary evo 然後耐心等待一下,即可順利安裝。前提是電腦里有conda!

windows上安装MySQL Server.

进入官网 MySQL 找到 下载,并点进入。 往下翻,找到社区下载,进入页面 选择 Mysql community Server 选择系统,下载 之后解压。 将解压文件夹下的bin路径添加到变量值中 配置初始化的my.ini文件 [mysqld] # 设置3306端口 port330…

Docker(镜像、容器、仓库)工具安装使用命令行选项及构建、共享和运行容器化应用程序

文章目录 前言🌟一、Docker工具安装🌟二、Docker命令行选项🌏2.1.docker run命令选项:🌏2.2.docker build命令选项:🌏2.3.docker images命令选项:🌏2.4.docker ps命令选项…

【日常总结】java JSON 转 实体类 (含多层嵌套)

一、场景 二、问题 三、解决方案 四、实战 1. 引入maven依赖 2. IEDA 安装lombok 插件 3. 安装 GsonFormPlu 插件 4. 使用 Stage 1:新建类,右键 选择 Generate Stage 2:选择 GsonFormatPlus Stage 3:将json复制其中&…

【Flink 问题集】The generic type parameters of ‘Collector‘ are missing

错误展示: Exception in thread "main" org.apache.flink.api.common.functions.InvalidTypesException: The return type of function main(CollectionDemo.java:33) could not be determined automatically, due to type erasure. You can give type in…

【揭秘Vue】nextTick的神秘面纱:原理与作用一览无余!

前言 - JavaScript执行原理EventLoop JavaScript执行原理涉及到Event Loop(事件循环)的概念。JavaScript是一种单线程语言,意味着它一次只能执行一个任务。然而,JavaScript经常需要处理异步任务,比如网络请求、定时器…

研究前沿| Nature:艰难梭菌引发肠道神经源性炎症的新机制

前言 艰难梭菌感染(Clostridioides difficile infection)是目前发达国家医院和社区内获得性肠道细菌感染腹泻的最主要原因之一。在美国,每年有约50万例病例和导致约29,000例死亡。艰难梭菌(C. difficile)是一种产生孢子…

sftp 从windows10向linux(centos7)传输文件

前言背景:该示例是需要从windows10向本地linux系统传输一个qt安装文件,不想或者无法安装xftp这些传输工具,直接通过命令传输; 首先保证windows10 ping通linux系统ip,linux ping 通windows10系统; 注意&am…

Linux:动静态库

目录 一、软硬链接 1、软链接 2、硬链接 二、动态库和静态库 编写一个库 ①静态库 使用静态库的方法 ②动态库 使用动态库的方法 库存在的意义 一、软硬链接 软硬链接的本质区别就是:有无独立的inode 软链接有独立的inode,也就意味着软链接是一…

Java(三)(static,代码块,单例设计模式,继承)

目录 static 有无static修饰的成员变量 有无static修饰的成员方法 static的注意事项 代码块 静态代码块 实例代码块 单例设计模式 饿汉式单例写法 懒汉式单例写法 继承 基本概念 注意事项 权限修饰符 单继承 object 方法重写 子类方法中访问其他成员(成员变量…

虹科分享 | PEAK版本升级,看看有没有你关注的新功能?

号外号外!近期PEAK进行了重要的版本升级,这次升级带来了许多令人兴奋的功能优化,助力您的工作流程更加便捷高效。为了帮助您更好地了解PEAK新版本,我们提供了详细的说明和指导,快来看看有没有你关注的新功能&#xff1…