【问题标题】:akka actor child troubles阿卡演员孩子的烦恼
【发布时间】:2018-02-02 00:48:37
【问题描述】:

我对这个案子感到非常惊讶。有人知道为什么会发生这种情况吗?

每次都能正常工作:

child(name) match {
  case Some(ref) => ref ! Ping
  case _ =>
    val ref = actorOf(PingActor.props, name)
    ref ! Ping
}

如果孩子不存在,我们将创建演员。 然后发送 Ping 消息。

这有时会挂断演员已经存在的情况:

child(name) getOrElse actorOf(PingActor.props, name) ! GetState

为什么?

【问题讨论】:

  • hangs up... 你的意思是有些东西冻结了?
  • 是的,发送消息时冻结
  • 你怎么知道它在发送消息时冻结,而不是在调用 getOrElse 时冻结?
  • 我只知道一件事 - 当我将它更改为匹配时,演员冻结在 getOrElse 的这个字符串上 - 它开始运行良好
  • 我从接受的答案中得知,这与冻结无关,只是没有发送消息。通过更准确地描述问题,您将更快地获得更好的答案。

标签: akka akka-actor


【解决方案1】:

简答

由于运算符优先级,您的消息仅在child(name) 返回None 时发送,即调用getOrElse

使用非中缀方法调用来避免这种情况:

child(name).getOrElse(actorOf(PingActor.props, name)) ! GetState

长答案

根据Scala language specification,Scala 中的中缀操作通常是左关联的,并且从左到右进行计算。如果是这种情况,您的代码将可以正常工作。

但是,也有运算符优先规则允许通常的数学和逻辑运算而无需括号。根据他们的说法,! 运算符的优先级高于getOrElse,并且在它之前被评估,因此从“内部”发送消息。

【讨论】:

    猜你喜欢
    • 2013-05-19
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多