gpt4 book ai didi

scala - Akka 经典与 Akka 打字

转载 作者:行者123 更新时间:2023-12-04 00:20:27 28 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它.

2年前关闭。




Improve this question




现在我正在学习 Akka。但是我发现 Akka 有两个版本:Classic 和 Typed。
它和我应该学习的有什么区别?

类型化版本是否有更强的类型控制?如果是,为什么只在 2.6 版本中引入?

谢谢回答。

最佳答案

“经典” Actor 是无类型的。您定义一个接受 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] .它不会阻止您将消息发送给错误的 Actor - 一个会默默忽略它的 Actor 。它不会阻止您发送错误类型的消息。您可以将所有内容发送给所有人。

从某种角度来看,您有一个并发模型 - 建立在强类型语言之上 - 与 JavaScript 一样强类型。

Akka Typed 所做的是,它使您可以通过围绕无类型参与者的类型包装器发送消息:
// 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)
}
}
}

这样你就有:
  • 类型化的 Actor (Behavior)告诉你他们接受什么样的消息
  • 输入 ActorRef这将帮助您只向 Actor 发送正确类型的消息
  • 输入 ActorSystem它定义了可以直接发送到参与者系统的消息类型。

  • 它只是“最近”才引入的,但它的工作持续了几年,直到最近,代码才达到其创建者预期的成熟度。模块 existed in repo for at least 2 years但据我记得,这项工作已经持续了一段时间。第一个标记为关于 Akka Typed 的问题来自 May 2017但最早可以追溯到 May 2014 的任何“类型化 Actor ”的工作(这意味着作者已经讨论了一段时间,尽管这些 earlier concepts 与我们今天的略有不同)。

    长话短说 - 打字(对于大多数人来说,大多数时候,YMMV)更好,但需要时间才能做到正确。如果您想在新建项目中使用它们(由于某种原因必须使用 Actor ),那么我建议您使用 Typed。如果您必须在现有项目中使用 Actors 工作,那么几乎可以肯定他们会使用经典,因此如果您想以 Akka 为生,就必须了解这两者。

    关于scala - Akka 经典与 Akka 打字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61148696/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com