在actor中的Future.pipeTo中会发生什么

时间:2017-08-22 11:14:32

标签: scala akka

我在演员收到的时候打电话给第三方图书馆(这会引起一个未来)。我将这个未来发展到Self,以便我可以将回复处理为邮箱中的消息。

class MyActor{
  def receive:Receive = {
    case x:Message => {
      val future = callToThridPartyLib(x)
      future pipeTo self
    }
    case x:Reply => {
      //process reply received on future completion
    }
  }
}

我的问题是

  1. 这种方法的开销是多少?

  2. 是否会为每个这样的pipeTo分配一个单独的线程 声明?

  3. 如果是这样,是否应该有一个线程池来管理pipeTo以避免全部 线程用完了吗?
  4. 谢谢

1 个答案:

答案 0 :(得分:4)

Victor说,但基本上: pipeTo的开销非常低:它创建了一个闭包,它发送一条消息。就是这样,不涉及额外的线程。消息是从已完成Future的线程发送的,并且将像所有actor消息一样接收到已为给定actor配置的调度程序。

尽管如此,您应该为ExecutionContext处理callToThirdPartyLib。如果它在内部使用阻塞调用,并且您使用默认的Akka调度程序来运行它(代码建议的那样),则可能会快速耗尽线程。然而,对于这个问题,这似乎是偏离主题的。

相关问题