Scala的actor 精选 原创 原生zzy 2019-01-01 12:24:15 博主文章分类:scala ©著作权 文章标签 actor akka actor 文章分类 scala 后端开发 ©著作权归作者所有:来自51CTO博客作者原生zzy的原创作品,请联系作者获取转载授权,否则将追究法律责任 1. Scala Actor (1)相关介绍: Scala中的actor能够实现并行编程的强大功能,他是基于事件模型的并发机制,scala是运用消息(message)的发送、接收来实现多线程的(Java是使用共享内存实现的)。使用 Scala 能够更容易地实现多线程应用的开发。 一个actor是一个容器,它包含状态,行为,信箱,子actor和监督策略。所有这些包含在一个actorReference(Actor引用)里。一个actor需要与外界隔离才能从actor模型中获益,所以actor是以actor引用的形式展现给外界的。 (2)Java并发编程模型与scala actor模型的区别: 1)Java : - Java 中的并发编程基本上满足了事件之间相互独立,但是事件不能够同时发生的场景的需要。 - Java 中的并发编程是基于共享数据和加锁的一种机制,即会有一个共享的数据,然后有 若干个线程去访问这个共享的数据(主要是对这个共享的数据进行修改),同时 Java 利用加锁 的机制(即 synchronized)来确保同一时间只有一个线程对我们的共享数据进行访问,进而保 证共享数据的一致性。 - Java 中的并发编程存在资源争夺和死锁等多种问题,因此程序越大问题越麻烦。 2)scala actor : - Scala 中的 Actor 是一种不共享数据,依赖于消息传递的一种并发编程模式,避免了死锁、资源争夺等情况。在具体实 现的过程中,Scala 中的 Actor 会不断的循环自己的邮箱,并通过 receive 偏函数进行消息的模式匹配并进行相应的处理。 - 如果 Actor A 和 Actor B 要相互沟通的话,首先 A 要给 B 传递一个消息,B 会有一个收件箱,然后 B 会不断的循环自己的收件箱,若看见 A 发过来的消息,B 就会解析 A 的消息并执行,处理完之后就有可能将处理的结果通过邮件的方式发送给 A。 对于 Java,我们都知道它的多线程实现需要对共享资源(变量、对象等)使用 synchronized 关键字进行代码块同步、对象锁互斥等等。而且,常常一大块的 try…catch 语句块中加上 wait 方法、notify 方法、notifyAll 方法是让人很头疼的。原因就在于 Java 中多数使用的是可变状态的对象资源,对这些资源进行共享来实现多线程编程的话,控制好资源竞争与防止对象状态被意外修改是非常重要的,而对象状态的不变性也是较难以保证的。而在 Scala 中, 我们可以通过复制不可变状态的资源(即对象,Scala 中一切都是对象,连函数、方法也是) 的一个副本,再基于 Actor 的消息发送、接收机制进行并行编程。 (3)actor中发消息的方式: (4)actor入门实例: pom.xml: <properties> <scala.version>2.11.8</scala.version> <scala.actors.version>2.11.8</scala.actors.version> </properties> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.scala-lang/scala-actors --> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-actors</artifactId> <version>${scala.actors.version}</version> </dependency> </dependencies> object Base_Actor { def main(args: Array[String]): Unit = { //调用start方法 new MyActor1().start() new MyActor2().start() } } ////继承Actor类,相当于Java中的Thread class MyActor1 extends Actor{ //重新 act 方法,相当于Java中的run方法 override def act(): Unit = { println("hahaha") } } //继承Actor类,相当于Java中的Thread class MyActor2 extends Actor{ //重新 act 方法,相当于Java中的run方法 override def act(): Unit = { println("hello world") } } // 注意:上面分别调用了两个单例对象的 start()方法,他们的 act()方法会被执行,相同与在 Java 中开启了两个线程,线程的 run()方法会被执行,这两个 Actor 是并行执行的。 2. Akka Actor (1) Akka Actor介绍: Akka 基于 Actor 模型,提供了一个用于构建可扩展的(Scalable)、弹性的(Resilient)、快速响应的(Responsive)应用程序的平台。 Actor 模型:在计算机科学领域,Actor 模型是一个并行计算(Concurrent Computation)模型, 它把 actor 作为并行计算的基本元素来对待:为响应一个接收到的消息,一个 actor 能够自己做出一些决策,如创建更多的 actor,或发送更多的消息,或者确定如何去响应接收到的下一个消息。 Actor是Akka中最核心的概念,它是一个封装了状态和行为的对象,Actor之间可以通过交换消息的方式进行通信,每一个actor都有自己的收件箱。通过Actor能够简化锁及线程管理,可以非常容易的开发出正确的并发程序和并行系统。 Actor 特性: 提供了一种高级抽象,能够简化在并发(Concurrency)/并行(Parallelism)应用场景下 的编程开发 提供了异步非阻塞的、高性能的事件驱动编程模型 超级轻量级事件处理(每 GB 堆内存几百万 Actor) (2) Akka Actor 重要API: - ActorSystem:在 Akka 中,ActorSystem 是一个重量级的结构,他需要分配多个线程,所以在实际应用中, ActorSystem 通常是一个单例对象,我们可以使用这个 ActorSystem 的 actorOf 方法创建很多 Actor。 - Actor:在 Akka 中,Actor 负责通信,在 Actor 中有一些重要的生命周期方法。 - preStart()方法:该方法在 Actor 对象构造方法执行后执行,整个 Actor 生命周期中仅执行一次。 - receive()方法:该方法在 Actor 的 preStart 方法执行完成后执行,用于接收消息,会被反复执行。 (3) Akka Actor 入门案例: pom.xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <scala.version>2.11.8</scala.version> <scala.actors.version>2.11.8</scala.actors.version> <akka.version>2.4.17</akka.version> </properties> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>${scala.version}</version> </dependency> <dependency> <groupId>com.typesafe.akka</groupId> <artifactId>akka-actor_2.11</artifactId> <version>${akka.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.scala-lang/scala-actors --> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-actors</artifactId> <version>${scala.actors.version}</version> </dependency> <dependency> <groupId>com.typesafe.akka</groupId> <artifactId>akka-remote_2.11</artifactId> <version>${akka.version}</version> </dependency> </dependencies> master: import java.text.SimpleDateFormat import java.util._ import akka.actor.{Actor, ActorSystem, Props} import com.typesafe.config.{Config, ConfigFactory} class MyMaster extends Actor{ def doHell(): Unit ={ println("我是master,我接受到了worker的消息!") } /** * 这就是一个偏函数, 用来处理当前这个actor对象接收到的所有的消息 */ override def receive: Receive = { case "hello" =>{ doHell //用以发送信息到相应的worker,!表示 异步无返回值 sender() ! "hi" } case "getNow" =>{ doHell sender() ! new SimpleDateFormat("yyyy-MM-dd").format(new Date()) } } } object MyMaster{ def main(args: Array[String]): Unit = { //1.构建一个:ActorSystem val strCOnfig= """ |akka.actor.provider = "akka.remote.RemoteActorRefProvider" |akka.remote.netty.tcp.hostname = localhost |akka.remote.netty.tcp.port = 9527 """.stripMargin val config: COnfig= ConfigFactory.parseString(strConfig) val myMaster: ActorSystem = ActorSystem("ActorSystemMaster",config) //2.通过actorsystem创建actor myMaster.actorOf(Props(new MyMaster()),"MasterActor") } } worker: import akka.actor.{Actor, ActorSystem, Props} import com.typesafe.config.{Config, ConfigFactory} class MyWorker extends Actor{ override def preStart(): Unit = { val hostname="localhost" val serveractorsystem="ActorSystemMaster" val serveractor="MasterActor" val port="9527" //在创建worker actor之前向master发送一个消息 val master=context.actorSelection(s"akka.tcp://${serveractorsystem}@${hostname}:${port}/user/${serveractor}") val message="getNow" //获得master相关对象,向master发送信息 master ! message } //处理相应的来自master返回的信息 override def receive: Receive = { case date:String => { println("时间日期:"+date) } case "hi" =>{ println("我是worker,接收到master发送过来的结果: hi") } } } object MyWorker{ def main(args: Array[String]): Unit = { //1.构建一个:ActorSystem val strConfig:String= """ |akka.actor.provider = "akka.remote.RemoteActorRefProvider" |akka.remote.netty.tcp.hostname = localhost """.stripMargin val config: COnfig= ConfigFactory.parseString(strConfig) val workerActorSystem: ActorSystem = ActorSystem("workerActorSystem",config) workerActorSystem.actorOf(Props(new MyWorker()),"workerActor") } } 赞 收藏 评论 分享 举报 上一篇:Hadoop的RPC 下一篇:Akka Actor模拟实现YARN 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 () 最热 最新 相关文章 Scala 运算符 Scala 无涯教程-Scala - 数组(Arrays) Scala提供了一种数据结构数组 ,它存储了相同类型元素的固定大小的顺序集合。声明数组要在程序中使用数... scala 有趣的CSS - 弹跳的圆 用css写一个好玩的不停弹跳变形的圆。 css 弹跳的圆 动效 动画 交互 scala actor ! 发送异步消息,没有返回值。 !? 发送同步消息,等待返回值。 !! 发送异步消息,返回值是 Future[Any]。 actor 例子 Scala在2.11.x版本中将Akka加入其中,作为其默认的Actor,老版本的Actor已经废弃packag... scala 异步消息 ide 消息发送 消息处理 scala 简要: Actor actor提供了并发程序中与传统的基于锁的结构不同的另一种选择,通过尽可能避免锁和共享状态,actor更容易地设计出正确、没有死锁或争用状况的程序。Scala提供了actor的简单实现,akka(http://akka.io)提供了高级actor类库。每个actor都要扩展Actor类并重写Act方法,actor是处理异步消息的对象,消息可以 操作符 发送消息 数据 167 Scala Actor Scala中的Actor能够实现并行编程的强大功能,它是基于事件模型的并发机制,Scala是运用消息(message)的发送、接收来实现多线程的。使用Scala能够更容易地实现多线程应用的开发。传统java并发编程与Scala Actor编程的区别对于Java,我们都知道它的多线程实现需要对共享资源(变量、对象等)使用synchronized 关键字进行代码块同步、对象锁互斥等等。而且,常常... scala 多线程 对象状态 C Scala Akka的Actor模型 OpenStack Akka 3 Akka actor 与 scala actor的不同 经常有人问: Akka的Actor和Scala的Actor有什么不同?这里的回答是,从actor 模型角度讲,没什么不同,它们都实现了actor model.Akka actors and Scala actors are two implementations of that model.All Actor model says that your concurrency p akka 3 scala actor Scala 【15 Actor 入门 】 Actor Scala 的 Actor 类似于 Java 中的多线程编程。但是不同的是,Sca scala Scala 发送消息 Java Scala Actor并发编程 1. Scala Actor并发编程 1.1. 目标 1.1.1. 目标一:熟悉Scala Actor并发编程 1.1.2. 目标二:为学习Akka做准备 注:Scala Actor是scala 2.10.x版本及以前版本的Actor。 Scala在2.11.x版本中将Akka加入其中,作为其默认的 Scala Scala Actor 通信模型 1.概念理解Java 中的并发编程Java 中的并发编程是基于共享数据和加锁的一种机制,即会有一个共享的数 据,然后有若干个线程去访问 scala java 开发语言 并发编程 170 Scala Actor 案例三 react方式会复用线程,比receive更高效,代码如下:package cn.itcast.actorimport scala.actors.Actor class YourActor extends Actor { override def act(): Unit = { loop { react { case "start" =>... # Scala # 云计算/大数据 168 Scala Actor 案例一 先看代码:package cn.itcast.actor//注意导包是scala.actors.Actorimport scala.actors.Actorobject MyActor1 extends Actor{ //重新act方法 def act(){ for(i <- 1 to 10){ println("actor-1 " + i) ... # Scala # 云计算/大数据 169 Scala Actor 案例二 使用Actor可以不断地接收消息,先看如下代码:package cn.itcast.actorimport scala.actors.Actor/** * Created by ZX on 2016/4/4. */class MyActor extends Actor { override def act(): Unit = { while (true) { ... 消息发送 scala ide C 170 Scala Actor 案例四 结合case class发送消息,代码如下:package cn.itcast.actorpackage cn.itcast.actorimport scala.actors.Actorclass AppleActor extends Actor { def act(): Unit = { while (true) { receive { cas... 异步消息 发送消息 scala C Scala之——Actor编程(基于Scala2.10.x) 1. 什么是 Scala Actor1.1.概念Scala 中的 Actor 能够实现并行编程的强大功能,它是基于事件模型的并发机制, Scala 是运用消息(message)的发送、接收来实现多线程的。使用 Scala 能够更容易地实现多线程应用的开发。1.2.传统 java 并发编程与 Scala Actor 编程的区别 对于Java,我们都知道它的多线程实现需要对共享资源(变量、对象等)使... Scala 大数据 Scala Actor并发编程入门示例 代码package cn.zxl.actorimport akka.actor.{Actor, ActorRef, ActorSystem, Props}/** * @description: * @author: zhangxueliang * @create: 2021-05-29 15:51 * @version: 1.0 * *///当我们继承 Actor 后,就是一个 Actor,核心方法 receive 方法重写class SayHelloActor extends Ac scala maven apache 其他 scala快速入门系列【Actor实现WordCount】 本篇作为scala快速入门系列的第三十九篇博客,为大家带来的是关于如何用Actor实现WordCount的内容。文章目录WordCount案例案例介绍思路分析实现思路步骤1 | 获取文件列表步骤2 | 创建WordCountActor步骤3 | 启动Actor /发送/接收任务信息步骤4 | 消息统... scala教程 框架 大数据 scala快速入门系列【Actor并发编程】 本篇作为scala快速入门系列的第三十八篇博客,为大家带来的是关于Actor并发编程的内容。文章目录Actor并发编程1.Actor介绍Java并发编程的问题Actor并发编程模型Java并发编程对比Actor并发编程2.创建Actor使用方式 java scala 云计算/大数据 Actor并发编程 spark Scala actor的使用 Actor 为什么需要Actor? Actor的本质即万物皆Actor, Actor之间只有发送消息这一种通信方式。例如,无论是管理员让工作者干活,还是工作者把成果交还给管理员,它们之间也要通过发送消息的方式来传递信息。这么做看似不如直接方法调用来的直接,但是由于大量的消息可以同时执行。同样,消... 死锁 发送消息 消息队列 操作符 消息传递