【发布时间】:2022-01-02 18:54:38
【问题描述】:
我有一系列相同类型的 scala Futures。
我想在有限的时间后得到整个序列的结果,而有些期货可能成功,有些可能失败,有些尚未完成,未完成的期货应视为失败。
我不想按顺序使用 Await 每个未来。
我确实看过这个问题:Scala waiting for sequence of futures 并尝试从那里使用解决方案,即:
private def lift[T](futures: Seq[Future[T]])(implicit ex: ExecutionContext) =
futures.map(_.map { Success(_) }.recover { case t => Failure(t) })
def waitAll[T](futures: Seq[Future[T]])(implicit ex: ExecutionContext) =
Future.sequence(lift(futures))
futures: Seq[Future[MyObject]] = ...
val segments = Await.result(waitAll(futures), waitTimeoutMillis millis)
但我仍然收到 TimeoutException,我猜是因为某些期货尚未完成。 该答案还指出,
现在 Future.sequence(lifted) 将在每个未来完成时完成,并使用 Try 表示成功和失败。
但我希望我的未来在超时之后完成,而不是在序列中的每个未来都完成时。我还能做什么?
【问题讨论】:
-
我认为这对于纯 scala 期货很难做到,因为在未来的 api 中没有“本机”超时处理。等待的超时不会这样做。我认为您应该研究允许此类处理的更完整的“异步”库。如果您有兴趣,我可以在 monix 中为您提供一个示例
-
@IvanStanislavciuc 是的,请提供一个示例,其中包含您认为最好的任何依赖项,我正在寻找高效的代码,我的期货清单将非常大