actor:可以发送和接收嵌套在接收中

时间:2013-04-27 14:20:34

标签: scala actor

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

1 个答案:

答案 0 :(得分:1)

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

是。您可以使用ask来获得未来(而不是自己创建一个完全成熟的演员),然后在Future上调用onComplete来设置一个将在Future的时候执行的动作。值(或错误)变得可用。不要担心未来可能会多快产生价值 - 这并不重要,因为即使在调用onComplete时Future已经可用,onComplete行动也会被执行!

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

事实上,在某些情况下,您可能会发现最简单的事情就是发送消息,让原始的actor处理回复。 becomeunbecome可能会有所帮助。但是,再次使用become时要小心,在演员的新行为中,它不会掉落&#34;普通&#34;应以普通方式处理的消息。