免费的域名网站,个人博客平台登录,新乡电商网站建设,网站建设合同 法律声明Scala中的Actor模型
概念
Actor Model是用来编写并行计算或分布式系统的高层次抽象#xff08;类似java中的Thread#xff09;让程序员不必为多线程模式下共享锁而烦恼。Actors将状态和行为封装在一个轻量的进程/线程中#xff0c;但是不和其他Actors分享状态#xff0c;…Scala中的Actor模型
概念
Actor Model是用来编写并行计算或分布式系统的高层次抽象类似java中的Thread让程序员不必为多线程模式下共享锁而烦恼。Actors将状态和行为封装在一个轻量的进程/线程中但是不和其他Actors分享状态每个Actors有自己的世界观当需要和其他Actors交互时通过发送事件和消息发送是异步的非堵塞的(fire-andforget)发送消息后不必等另外Actors回复也不必暂停每个Actors有自己的消息队列进来的消息按先来后到排列这就有很好的并发策略和可伸缩性可以建立性能很好的事件驱动系统。
2.12版本后actor彻底从scala中抽离了出来所以我们在使用前需要引入相应的lib。
dependencygroupIdcom.typesafe.akka/groupIdartifactIdakka-actor_2.12/artifactIdversion2.5.9/version
/dependencyActor的特征
ActorModel是消息传递模型,基本特征就是消息传递消息发送是异步的非阻塞的消息一旦发送成功不能修改Actor之间传递时接收消息的actor自己决定去检查消息actor不是一直等待是异步非阻塞的
具体写法
Actor发送接收消息
import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Propsclass 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 ! heyhelloActor ! 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 模型的基本概念和用法
Actor 的创建和消息传递
import akka.actor.{Actor, ActorSystem, Props}class MyActor extends Actor {def receive: Receive {case message: String println(sReceived message: $message)}
}val system ActorSystem(MySystem)
val myActor system.actorOf(Props[MyActor], myActor)myActor ! Hello在上述示例中我们定义了一个 MyActor 类它继承自 Actor 并重写了 receive 方法来处理消息。通过 ActorSystem 和 Props我们创建了一个名为 “MySystem” 的 Actor 系统并创建了一个名为 “myActor” 的 Actor 实例。然后我们通过 ! 运算符向 myActor 发送了一条消息 “Hello”。
Actor 之间的相互协作
class GreetingActor extends Actor {def receive: Receive {case message: String val senderActor sender()println(sGreetingActor 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(sResponse: $message)case Failure(ex) println(sFailed: ${ex.getMessage})
}在上述示例中我们创建了一个 GreetingActor 类它也是一个 Actor。在 receive 方法中它接受到消息后会打印出接收到的消息并通过 sender() 方法获取发送消息的 Actor并向其发送一条回复消息。
在主程序中我们使用 ask 方法向 myActor 发送一个问候消息并等待回复。通过 mapTo 方法将回复消息转换为字符串类型并使用 onComplete 处理回复结果。
总之Scala 中的 Actor 模型提供了一种高效且易于编写并发代码的方式。Akka 框架为 Scala 提供了完善的 Actor 模型实现使我们能够轻松构建并发和并行计算应用程序。