2015-09-22 70 views
0

考慮下面的代碼片段未來終端應用

class MyActor extends Actor { 
    def receive = { 
     case msg: String => 
      val f: Future[Long] = <some future> 
      f pipeTo self 
      context.become(afterFuture) 
    } 

    def afterFuture: Receive = { 
     case futureResult: Long => 
      // process the future result 
    } 
} 

所描述的情況所以,我們必須啓動一個未來的執行中的演員,管道它導致自身。然後它改變它的行爲,以便能夠處理未來的結果。 在context.become的調用可以生效之前,是否有未來終止的可能性,並且因此演員無法處理未來的結果?

我的猜測是,它不是因爲當前消息(msg:String)的處理只會在context.become生效後終止,此時郵箱中的下一條消息將被處理,新的行爲將會已經到位。儘管如此,我還是希望得到其他人肯定比我更有認識的人。

回答

1

不,您的電話context.become將在下一封郵件處理完成之前完成。在這種情況下沒有競爭條件。