[英]A future used in Future.sequence fails - which failure is reported and when?
可以使用Future.sequence将多个期货组合成一个。 当所有这些都成功时,结果是显而易见的——它是结果的顺序,一旦它们全部完成,就可以使用。 然而,当一些(甚至多个)期货失败时会发生什么并不清楚,我也没有发现它记录在案。 我的Scastie 实验似乎表明,一旦任何未来失败,就会立即报告失败。
import scala.concurrent._
import scala.util._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration.Duration
val f1 = Future {
Thread.sleep(600)
println("f1 done")
}
val f2 = Future {
Thread.sleep(400)
println("f2 done")
throw new Exception("Failed")
}
val f3 = Future {
Thread.sleep(200)
println("f3 done")
throw new Exception("Failed")
}
val results = Future.sequence(Seq(f1, f2, f3))
results.onComplete {
case Success(_) =>
println("Seq completed")
case Failure(_) =>
println("Seq failed")
}
Await.result(results, Duration.Inf)
给出结果:
f3 完成
测序失败
是否有关于报告哪个失败以及任何期货失败的时间的保证或规范?
返回哪个未来是一个实现细节。
Future.sequence
的当前实现又依赖于zipWith
的实现, Future
trait 的实现可以自由覆盖,因此它不仅依赖于Future.sequence
的实现,还依赖于任何库为您提供Future
s (以及Future.successful
/ Future.failed
类的行为可能与Future
Future { }
或什至源自ZIO
或 Cats-Effect IO
或 Akka 等问题的 Future 不同)。
简而言之,正确性永远不应该取决于从Future.sequence
返回哪个失败:您可以依赖的是至少有一个期货失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.