我正在尝试找到异步初始化actor的正确模式,以便查找它所需的依赖ActorRef
。我想避免使用ActorSelection
,因为它是
- 它指向的参与者数量不明确,以及
- 有一些开销,这对于许多
tell
来说是不希望的
从Actor生命周期来看,在消息循环开始之前,它似乎都是同步的,包括preStart
等,这让我认为我只有两个选择之一:
使用签名为Future[ActorRef]
的工厂方法
构造actor的所有依赖项都是异步解析的,并通过Props
传入。
这种方法的主要问题是,你不能使用这个工厂在另一个参与者内部构建一个参与者,因为它也有同样的问题,即它一直是乌龟,异步连接所有参与者的层次结构及其依赖关系。
使用become
和stash
转换演员
actor是用actorOf
创建的,立即生成ActorRef
,但它从初始化状态开始,执行依赖项解析,同时stash
处理传入消息,最后become
处理运行和unstashAll
。
尽管我的依赖项都是var
而不是val
,但这对参与者来说更为惯用。
两者似乎都有很大的开销,这让我想知道这些是不是最好的选择,或者我只是在文档中没有找到合适的模式。
使用begine:时,您的依赖项没有理由必须是vars
val initializing: Actor.Receive = {
case Dependencies(d1, d2) => context.become(working(d1, d2))
}
def working(d1: Dependency, d2: Dependency): Actor.Receive = {
case msg => d1.fetch(...) // whatever
}
def receive = initializing
此外,actorFor
是a)不推荐使用的,b)不创建参与者。