【问题标题】:Wait for some timeout value for future等待未来的一些超时值
【发布时间】:2014-06-17 11:42:08
【问题描述】:

假设我有一个未来:

val fut = future(...)

我想在这个未来等待一段时间,如果超时到期,未来应该返回一些预定义的值。 我知道将来可以等待,但我想避免这样的代码:

try {
 val result = Await.result(fut, timeout)
} catch {
 case ex: TimeoutException => ???
}

也许有更实用的方法?

编辑 我有一个演员被要求返回一些价值。 Akka 的askAwait.result 具有隐式参数超时。 第一个问题是这些超时如何相互关联?第二个问题是:我想从演员那里得到结果。我需要先询问演员,然后等待返回的未来,我应该为这两个函数使用相同的超时吗?

【问题讨论】:

  • 执行询问的演员对结果做了什么?然后该参与者是根据该结果将某些内容发送回其发送者,还是只是根据询问的结果在内部采取一些行动?

标签: scala akka future


【解决方案1】:

首先,看看这个question

如果你有一个超时行为的未来,应该可以使用恢复:

val fut = future(...)
fut.recover { case t: TimeoutException => defaultValue }

编辑:

问题 1

来自询问模式 scaladoc:

异步发送消息并返回一个 [[scala.concurrent.Future]] 持有最终回复消息;这 表示目标actor需要将结果发送到sender 提供参考。未来将完成 [[akka.pattern.AskTimeoutException]] 给定超时后 已到期; 这与在等待 这个未来的结果(即Await.result(..., timeout)

问题2

我会为两者使用相同的超时,除非您希望两个超时之一在另一个超时之前结束(例如,您希望处理来自 Await 的异常而不是来自未来的 Failure)。

也就是说,我希望您知道应尽可能避免屏蔽

【讨论】:

  • >>> 我会为两者使用相同的超时,除非您希望两个超时之一在另一个超时之前结束 发送消息时处理超时。 2> 处理超时等待Future 完成。另一个后续问题..如果我希望超时等待消息发送
【解决方案2】:

如果您使用 Akka,ask 通常不是解决此问题的最惯用方法。你强迫事件的顺序是明确的(我问,然后等待响应,然后继续做一些工作)。

最好“一劳永逸”:将请求作为普通消息发送给actor,然后像往常一样在receive 方法中处理响应。这使您可以保持完全异步。

除非在收到该演员的回复之前你真的无法做任何有用的工作,否则最好避免ask

如果你真的必须使用asktimeout参数是Akka框架在完成FutureAskTimeoutException之前等待这个actor响应的时间,这个超时是独立于等待未来结果时应用的任何超时(即在 Await.result(..., timeout)

【讨论】:

  • 我在那里使用actor,因为我想同步对某些资源的访问。我可以使用同步方法,但对我来说,使用 actor 来达到这个目的似乎更方便。此外,该资源必须以某种频率更新。 Akka 提供了调度器之类的功能(对 akka 的使用多加一点)
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 2020-08-11
  • 2020-03-09
  • 2020-04-20
  • 2021-07-24
  • 1970-01-01
相关资源
最近更新 更多