我正在與Akka 2製作一個小型緩存演員,並且讓演員不會阻止我在期貨內執行所有計算。然而,一個問題是,這個角色還需要與不在actor中的代碼進行交互,這樣我需要使用「ask」模式來獲得一個值。Akka在迴應非演員代碼時避免包裝未來
我的問題是,如何在使用ask模式時避免將未來的計算包裹在另一個Future中?
例如
val f = myCache ? GetOrCalc("myKey", myCalculation) // this will be a Future[Future[...]] but I would like a Future[...]
// meanwhile, inside the actor
def receive = {
case GetOrCalc(key, calculation) =>
if (keyNotExists) sender ! Future { calculation() } // calculation() is long-running
else sender ! cacheMap(key)
}
理想的情況下,我可以使用Future.pipeTo功能,但恐怕這並不被計數爲「響應」非演員代碼
奇怪的是,這正是我的原始僞代碼,甚至沒有測試它,因爲我認爲pipeTo不會作爲「響應」工作。這就是我沒有測試,只是假設!雖然事實被告知這種行爲不在我上面提到的文檔中。非常感謝Viktor! – Aktau
相信巴生 –
我想知道「pipeTo發件人」如何安全地訪問發件人。我明白爲什麼你不能在Future中訪問發件人,但是pipeTo發件人怎麼沒有同樣的問題。是否因爲pipeTo在未來完成之前在演員的上下文中評估發件人? –