现在我正在学习阿克卡。但是我发现Akka有两个版本:经典版和打字版。它和我应该学什么有什么区别?
类型版本是否具有更强的类型控制?如果是,为什么它只在2.6版中引入?
谢谢你的回答。
发布于 2020-04-10 22:37:08
“经典”演员是未输入的。您可以定义一个接受Any对象的参与者,并使用模式匹配来定义它将实际处理哪些消息。
// from https://doc.akka.io/docs/akka/current/actors.html
class MyActor extends Actor {
val log = Logging(context.system, this)
def receive = {
case "test" => log.info("received test")
case _ => log.info("received unknown message")
}
}您必须为每个参与者定义的receive是PartialFunction[Any, Unit]。它并不能阻止你向错误的演员发送信息--一个会默默地忽略它的人。它并不能阻止你发送错误类型的信息。你可以把所有东西都寄给每个人。
从某种角度来看,您有一个并发模型--构建在强类型语言的基础上--它与JavaScript一样强类型。
Akka类型化的功能是,它让您通过非类型化参与者周围的类型化包装发送消息:
// from https://doc.akka.io/docs/akka/current/typed/actors.html#akka-actors
object HelloWorld {
final case class Greet(whom: String, replyTo: ActorRef[Greeted])
final case class Greeted(whom: String, from: ActorRef[Greet])
def apply(): Behavior[Greet] = Behaviors.receive { (context, message) =>
context.log.info("Hello {}!", message.whom)
message.replyTo ! Greeted(message.whom, context.self)
Behaviors.same
}
}
object HelloWorldBot {
def apply(max: Int): Behavior[HelloWorld.Greeted] = {
bot(0, max)
}
private def bot(greetingCounter: Int, max: Int): Behavior[HelloWorld.Greeted] =
Behaviors.receive { (context, message) =>
val n = greetingCounter + 1
context.log.info2("Greeting {} for {}", n, message.whom)
if (n == max) {
Behaviors.stopped
} else {
message.from ! HelloWorld.Greet(message.whom, context.self)
bot(n, max)
}
}
}这样你就可以:
Behavior),它告诉您他们接受什么样的消息ActorRef,它只会帮助您向参与者发送正确的消息。ActorSystem,它定义了可以直接发送给参与者系统的消息类型。它是“最近”才引入的,但是它的工作持续了几年,只是在最近,它的创建者们想要的代码达到了成熟。模块在回购公司存在至少2年,但据我所知,它的工作已经持续了一段时间。第一个被标记为关于Akka类型的问题来自2017年5月,但是任何“类型演员”的工作都可以追溯到2014年5月 (这意味着作者已经讨论了一段时间了,尽管这些早期概念与今天的略有不同)。
长篇短篇小说打得更好(对大多数人来说,大多数情况下,YMMV)更好,但要把它做好需要时间。如果您想在绿地项目中使用它们(因为某种原因必须使用参与者),那么我建议输入。如果你必须在一个现有的项目与演员,然后几乎肯定他们将使用经典,所以你必须知道这两者,如果你想要谋生的Akka。
https://stackoverflow.com/questions/61148696
复制相似问题