我在演员收到的时候打电话给第三方图书馆(这会引起一个未来)。我将这个未来发展到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
}
}
}
我的问题是
这种方法的开销是多少?
是否会为每个这样的pipeTo分配一个单独的线程 声明?
谢谢
答案 0 :(得分:4)
Victor说,但基本上:
pipeTo
的开销非常低:它创建了一个闭包,它发送一条消息。就是这样,不涉及额外的线程。消息是从已完成Future
的线程发送的,并且将像所有actor消息一样接收到已为给定actor配置的调度程序。
尽管如此,您应该为ExecutionContext
处理callToThirdPartyLib
。如果它在内部使用阻塞调用,并且您使用默认的Akka调度程序来运行它(代码建议的那样),则可能会快速耗尽线程。然而,对于这个问题,这似乎是偏离主题的。