Estoy haciendo un pequeño actor de caché con Akka 2 y para que el actor no bloquee, realizo todos los cálculos dentro de futuros. Sin embargo, un problema es que este actor también necesita interactuar con un código que no está en sí mismo en un actor, por lo que necesito usar el patrón "preguntar" para obtener un valor.Akka evitando envolver futuro al responder al código que no es Actor
Mi pregunta es, ¿cómo evito envolver el futuro de mis cálculos dentro de otro futuro al usar el patrón preguntar?
Por ejemplo
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)
}
Lo ideal sería que podría utilizar la función Future.pipeTo pero me temo que esto no quede cuenta como una "respuesta" para el código no el actor
Extrañamente, esto es exactamente lo que tenía en mi pseudocódigo original y ni siquiera lo probé porque supuse que el pipa no funcionaría como una "respuesta". ¡Eso es lo que obtengo por no probar y solo asumir! Aunque a decir verdad este comportamiento no está en los documentos como mencioné anteriormente. Muchas gracias Viktor! – Aktau
Confíe en el Klang –
Me pregunto cómo "pipeTo sender" está accediendo con seguridad al remitente. Entiendo por qué no puede acceder al remitente desde dentro del futuro, pero ¿cómo es que el remitente de pipeTo no tiene el mismo problema? ¿Lo es porque pipeTo evalúa al remitente en el contexto del actor antes de que el futuro se complete? –