处理消息时,是否可以向另一个actor发送消息并等待该actor回复,并使用回复的消息然后继续,如下所示,是否可行?
val lineMap=HashMap[String,Int]()
receive {
case bigTaskMap=>
for (line <-readSomeFile){
if(lineMap.get(line)==None){
anotherActor!line // that actor will reply a hashmap which contain the key for line
receive {
case x:HashMap => lineMap=x
}
}
lineMap.get(line) // use that value to do further work
}
}
答案 0 :(得分:1)
这个答案适用于Akka (旧的Scala演员在Scala 2.10中已弃用)。
是。您可以使用ask
来获得未来(而不是自己创建一个完全成熟的演员),然后在Future上调用onComplete
来设置一个将在Future的时候执行的动作。值(或错误)变得可用。不要担心未来可能会多快产生价值 - 这并不重要,因为即使在调用onComplete
时Future已经可用,onComplete
行动也会被执行!
但是,要非常小心:您不应该直接访问操作中包含actor中的任何状态(即变量),因为onComplete操作不会在与同一执行上下文中运行演员(即他们可以在原始演员正在处理消息的同时运行)。相反,将更多消息发送回原始actor,或转发它们。
事实上,在某些情况下,您可能会发现最简单的事情就是发送消息,让原始的actor处理回复。 become
和unbecome
可能会有所帮助。但是,再次使用become
时要小心,在演员的新行为中,它不会掉落&#34;普通&#34;应以普通方式处理的消息。