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时需要执行的操作-
也就是说,使用构造函数参数“隐藏”创建ActorA的实例。

即使您的 Actor 实例没有参数
context.actorOf(Props(new ActorA))

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

10-06 11:13