假设我有一个未来:
val fut = future(...)
我想在这个未来等待一段时间,如果超时到期将来应该返回一些预定义的值。 我知道未来有可能等待,但我想避免这样的代码:
try {
val result = Await.result(fut, timeout)
} catch {
case ex: TimeoutException => ???
}
也许有更实用的方法?
修改
我有一个被要求返回一些价值的演员。
Akka的ask
具有隐式参数超时以及Await.result
。
第一个问题是这些超时如何与彼此相关?第二个问题是:我想从演员那里得到结果。我需要首先询问actor然后等待返回的未来,我是否应该对这两个函数使用相同的超时?
答案 0 :(得分:3)
首先,看看这个question。
然后,如果你有一个超时行为的未来,应该可以使用recover:
val fut = future(...)
fut.recover { case t: TimeoutException => defaultValue }
编辑:
问题1
来自询问模式scaladoc:
异步发送消息并返回一个 [[scala.concurrent.Future]]持有最终回复消息;这个 意味着目标参与者需要将结果发送到
sender
参考提供。未来将以一个完成 给定超时后[[akka.pattern.AskTimeoutException]] 过期; 这与等待a时应用的任何超时无关 这个未来的结果(即在Await.result(..., timeout)
)。
<强>问题2 强>
我会对两者使用相同的超时,除非您希望两个超时之一在另一个之前结束(例如,您希望从Await处理异常而不是将来的失败)。
尽管如此,我希望您知道应尽可能避免阻止 。
答案 1 :(得分:0)
如果您正在使用Akka,ask
通常不是解决此问题的最常用方法。你强迫事件的顺序是明确的(我问,然后等待响应,然后继续做一些工作)。
更好地解雇&#34;:将请求作为正常消息发送给actor,然后像往常一样处理receive
方法中的响应。这使您可以保持完全异步。
除非你在收到这位演员的回复之前真的无法做任何有用的工作,否则最好避免ask
。
如果您真的必须使用ask
,则timeout
参数是Akka框架在使用{{1}完成Future
之前等待此actor的响应的时间量},此超时独立于等待未来结果时应用的任何超时(即在Await.result(...,timeout)