2013-10-02 49 views
4

我有一個演員,採取從另一個演員的結果,並對其應用一些檢查。阿卡演員轉發消息與繼續

class Actor1(actor2:Actor2) { 

    def receive = { 
    case SomeMessage => 
     val r = actor2 ? NewMessage() 
     r.map(someTransform).pipeTo(sender) 
    } 
} 

現在,如果我做一個問Actor1的,我們現在已經產生2個期貨,這似乎並不過分高效。有沒有辦法提供某種延續的方法,或者我可以在這裏使用的其他方法?

case SomeMessage => actor2.forward(NewMessage, someTransform) 
+0

如果Actor1沒有做太多的事情,你不能將它創建爲Actor。創造未來的未來有什麼問題?這是爲了這樣。 –

+0

由於額外的成本,阿卡文件不鼓勵對期貨的過度使用,所以我希望他們可能有辦法處理這種情況,這將減少有2期貨,其中一個會做.. –

回答

3

期貨在ExecutionContext中執行,就像線程池一樣。創造一個新的未來並不像創建一個新的線程那麼昂貴,但它有其成本。與期貨合作的最佳方式是創建儘可能多的所需資源,然後以可並行計算的事物並行計算,如果有必要的資源可用的話。這樣你就可以充分利用你的機器。

您提到akka文件不鼓勵過度使用期貨。我不知道你在哪裏閱讀這篇文章,但我認爲這意味着更願意改造未來,而不是創造自己的未來。這正是你使用地圖所做的。此外,這可能意味着如果您創建了一個不需要的未來,那麼您將增加不必要的開銷。

在你的情況下,你有一個返回未來的調用,你需要應用一些變換並返回結果。使用地圖是要走的路。

+0

我從註釋中略微推斷: 使用ask有性能影響,因爲有些東西需要跟蹤它的超時時間,需要將Promise連接到ActorRef並且它還需要通過遠程訪問才能訪問。所以總是喜歡講性能,只問你是否必須。 –

+2

這個提示告訴你,詢問(你的代碼中的?)是一個比告訴(!)更昂貴的操作,因爲ask實際上創建了一個匿名專門角色來處理你的actor的回覆,並完成在未來的承諾,你回來。 未來本身比演員更輕量級。 –