6

私は Akka 2 で小さなキャッシング アクターを作成しています。アクターがブロックされないようにするために、先物内ですべての計算を実行します。ただし、問題は、このアクターは、それ自体がアクターに含まれていないコードと対話する必要があることです。そのため、「ask」パターンを使用して値を取得する必要があります。

私の質問は、ask パターンを使用するときに、計算の Future を別の 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 関数を使用できますが、残念ながらこれは非アクター コードの「応答」としてカウントされません。

4

2 に答える 2

6

これが解決策です:

val f = myCache ? GetOrCalc("myKey", myCalculation)

def receive = {
    case GetOrCalc(key, calculation) =>
        if (keyNotExists) Future { calculation() } pipeTo sender
        else sender ! cacheMap(key)
}

Send-And-Receive-Future">http://doc.akka.io/docs/akka/2.0.3/scala/actors.html#Ask_Send-And-Receive-Future

于 2012-09-17T15:27:00.087 に答える
3

計算フューチャに onComplete を追加します。

def receive = {
    case GetOrCalc(key, calculation) =>
        if (keyNotExists) // calculation() is long-running
            Future { calculation() } onComplete {
                case Right(result) => result match {
                        case Some(value) => sender ! value
                        case None => sender ! Status.Failure(new Exception("Cannot find the value"))
                    }
                case Left(ex) =>
                    sender ! Status.Failure(ex)

            }
        else sender ! cacheMap(key)
}

また、Akka を使用してキャッシュ システムを構築する方法についての記事もあります。http://letitcrash.com/post/30509298968/case-study-an-auto-updating-cache-using-actors

于 2012-09-17T09:21:18.857 に答える