我正在与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在未来完成之前在演员的上下文中评估发件人? –