5

我有一个演员,它从另一个演员那里得到结果并对其进行一些检查。

class Actor1(actor2:Actor2) {

  def receive = {
    case SomeMessage =>
      val r = actor2 ? NewMessage()
      r.map(someTransform).pipeTo(sender)
  }
}

现在,如果我询问 Actor1,我们现在生成了 2 个期货,这似乎并不太有效。有没有办法为前锋提供某种延续,或者我可以在这里使用的其他方法?

    case SomeMessage => actor2.forward(NewMessage, someTransform)
4

1 回答 1

4

Futures 在 ExecutionContext 中执行,类似于线程池。创建一个新的未来并不像创建一个新线程那样昂贵,但它有它的成本。使用 future 的最佳方法是根据需要创建并组合,然后在必要的资源可用的情况下并行计算可以并行计算的事物。这样,您将充分利用您的机器。

您提到 akka 文档不鼓励过度使用期货。我不知道你在哪里读到这篇文章,但我认为这意味着更喜欢改变未来而不是创造你自己的未来。这正是您使用 map 所做的。此外,这可能意味着如果你创建一个不需要它的未来,你就会增加不必要的开销。

在您的情况下,您有一个返回未来的调用,您需要应用 sometransform 并返回结果。使用地图是要走的路。

于 2013-10-02T14:21:42.163 回答