gpt4 book ai didi

scala - 为什么在 actor 中创建一个 actor 是危险的

转载 作者:行者123 更新时间:2023-12-02 20:48:32 27 4
gpt4 key购买 nike

Akka documentation明确指出,像这样在 Actor 中创建 Actor 是危险的:

class ActorA extends Actor {
def receive = ???
}

final class ActorB extends Actor {
def receive = {
case _ =>
val act = context.actorOf(Props(new ActorA))
}}

据我了解,Actor 的 apply 方法正在接受创建 Actor 的 this 引用。但我无法理解(也找不到任何示例)为什么这是有害的以及它会导致什么问题?

最佳答案

让我们稍微调整一下您的示例

class ActorA(str:String) extends Actor {
def receive = ???
}

final class ActorB extends Actor {
def receive = {
case _ =>
val act = context.actorOf(Props(new ActorA("hidden")))
}}

使用 Actor 的大多数常见用例都是处理故障转移和监督,当 Actor 发生故障并需要重新启动时,Actor 系统需要知道如何执行此操作。当你使用Props(Props(new ActorA))时,你已经通过自己处理隐藏了“hidden”的参数值。

如果您声明如何创建 Actor 的实例,则 Actor 系统将确切地知道在重新创建 Actor 时需要做什么,而不是这样做 -即创建一个构造函数参数为“hidden”的 ActorA 实例。

即使你的 Actor 示例没有参数

context.actorOf(Props(new ActorA))

不建议在另一个 Actor 中实例化 Actor 的这种方式,因为它会鼓励关闭封闭范围,从而导致不可序列化的 Props 和可能的竞争条件(破坏 Actor 封装)。

关于scala - 为什么在 actor 中创建一个 actor 是危险的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44536712/

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