0

在处理消息时,是否可以向另一个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
       }
}
4

1 回答 1

1

这个答案适用于 Akka(旧的 Scala 演员在 Scala 2.10 中已弃用)。

是的。您可以使用ask来获取未来(而不是自己创建一个成熟的演员),然后调用onComplete返回的未来来设置一个动作,该动作将在未来的值(或错误)可用时执行。不要担心 Future 产生值的速度有多快——这并不重要,因为onComplete即使 Future 在onComplete被调用时已经可用,该操作也会被执行!

但是,要非常小心:您不应该在您的操作中直接访问包含参与者的任何状态(即变量),因为 onComplete 操作不会在与参与者相同的执行上下文中运行(即它们可以在原始参与者处理消息的同时运行)。相反,将更多消息发送回原始参与者,或继续转发。

事实上,在某些情况下,您可能会发现最简单的事情就是发送一条消息,然后让原始参与者处理回复。become并且unbecome可以在这里提供帮助。但是,再次注意,如果使用become, 在演员的新行为中,它不会丢弃应该以普通方式处理的“普通”消息。

于 2013-04-27T15:30:10.197 回答