val listOfFutures: In-6ren">
gpt4 book ai didi

scala - 在做 Future.sequence 时如何知道哪个 Future 失败?

转载 作者:行者123 更新时间:2023-12-04 22:59:39 24 4
gpt4 key购买 nike

这是一个示例接收我正在处理的 Actor 的一部分:

def receive = {
case "begin" =>
val listOfFutures: IndexedSeq[Future[Any]] = workers.map(worker => worker ? Work("test"))
val future: Future[IndexedSeq[Any]] = Future.sequence(listOfFutures)

future onComplete {
case Success(result) => println("Eventual result: "+result)
case Failure(ex) => println("Failure: "+ex.getMessage)
}
case msg => println("A message received: "+msg)
}

当对其中一个工作人员的询问失败时(在超时的情况下),序列 future 以失败告终。但是我想知道哪些 worker 失败了。有没有更优雅的方法,而不是简单地将 listOfFutures 一一映射而不使用 Future.sequence ?

最佳答案

您可以使用 future 的recover映射或包装底层异常的方法:

import scala.concurrent.{Future, ExecutionContext}

case class WorkerFailed(name: String, cause: Throwable)
extends Exception(s"$name - ${cause.getMessage}", cause)

def mark[A](name: String, f: Future[A]): Future[A] = f.recover {
case ex => throw WorkerFailed(name, ex)
}

import ExecutionContext.Implicits.global

val f = (0 to 10).map(i => mark(s"i = $i", Future { i / i }))
val g = Future.sequence(f)

g.value // WorkerFailed: i = 0 - / by zero

关于scala - 在做 Future.sequence 时如何知道哪个 Future 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29606964/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com