使用Future.sequence时若有Future失败,会报告哪次失败及何时报告?
关于Scala Future.sequence的失败行为疑问
我们可以用Future.sequence将多个Future合并为一个:当所有Future都成功时,结果是所有结果的序列,会在全部完成后返回。但当部分(甚至多个)Future失败时的行为并不明确,官方文档也没有相关说明。
通过以下实验代码发现,一旦任意Future失败,合并后的Future会立即报告失败:
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 done
Seq failed
请问当任意Future失败时,合并后的Future会报告哪次失败、以及何时报告,是否有明确的保障或规范?
回答
- 失败触发时机:
Future.sequence会在第一个完成且失败的Future出现时,立即将合并后的Future标记为失败,不会等待剩余Future完成。这就是实验中f3完成后立刻输出Seq failed的原因——它是最早完成的失败Future。 - 报告的异常内容:合并后的Future会返回第一个失败Future抛出的异常,后续其他Future的失败不会覆盖这个结果,也不会被传递出来。
- 行为的底层逻辑:虽然Scala官方文档没有明确写明这个行为,但它是由
Future.sequence的实现逻辑决定的:方法内部通过遍历序列中的Future,逐个进行flatMap组合,一旦某个Future失败,整个组合链就会短路,直接返回失败结果,这属于该方法的既定行为,可以视为隐含规范。
内容的提问来源于stack exchange,提问作者Suma
相关产品推荐
相关产品推荐

