Akka演员前进消息与继续

J P*_*lar 5 scala future actor akka

我有一个演员从另一个演员那里获取结果并对它进行一些检查.

class Actor1(actor2:Actor2) {

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

现在,如果我问一下Actor1,我们现在已经生成了2个期货,这看起来并不过分.有没有办法提供某种延续的方法,或者我可以在这里使用的其他方法?

    case SomeMessage => actor2.forward(NewMessage, someTransform)
Run Code Online (Sandbox Code Playgroud)

Vin*_*ana 4

Futures 在 ExecutionContext 中执行,就像线程池一样。创建一个新的 future 并不像创建一个新线程那么昂贵,但它有其成本。使用 future 的最佳方法是根据需要创建尽可能多的内容,然后以这样的方式进行组合:如果必要的资源可用,则可以并行计算可并行计算的内容。这样您就可以充分利用您的机器。

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

在您的情况下,您有一个返回未来的调用,您需要应用一些转换并返回结果。使用地图是必经之路。

  • 该注释是为了警告您,ask(代码中的?)是比tell(!)更昂贵的操作,因为ask实际上在幕后创建了一个匿名的专门actor来处理来自actor的回复并完成Promise用于您返回的未来。Future 本身比 Actor 更轻量。 (2认同)