gpt4 book ai didi

scala - 同步 2 个或更多 Future 的计算

转载 作者:行者123 更新时间:2023-12-01 19:42:14 25 4
gpt4 key购买 nike

我发现我无法弄清楚如何同步 2 和更多的计算 Futures :

val fs = List(1, 2, 3) map { x => Future { /* some computation depending on x... */ } }
fs(0) onComplete {
case Success(x) =>
fs(1) onComplete {
case Success(x) =>
fs(2) onComplete ....
}

这看起来不太明智。

我想从 fs 中获取所有值.我该怎么做呢?

最佳答案

使用 Future.traverse

val inList = List(1, 2, 3)
val fs = Future.traverse(inList) { x =>
Future {
/* some computation depending on x... */
}
}

fs onSuccess { case outList =>
...
}

如果任何元素失败,这将失败。

如果你想要所有的结果,不管失败还是成功,那么最好的方法就是 recover它们,将结果包装在 Try 的实例中:
def asyncFunc(i: Int): Future[String] = ...

val inList = List(1, 2, 3)
val rawResults = inList.map(asyncFunc)
val recoveredResults = rawResults.map(Success(_)).recover(case x => Failure(x))

val completedResults = Future.sequence(recoveredResults)

completedResults onSuccess { case outList =>
outList map {
case Success(s) => ...
case Failure(t) => ...
}
}

提示:如果你经常做这种事情,通常更容易确保 全部 您的异步方法使用 Future[Try[T]] 的实例成功完成,而不是在 Future 中嵌入任何错误

像这样的东西:
def slowFunc(i: Int): String = ...
def asyncFunc(i: Int): Future[Try[String]] = Future { Try { slowFunc(i) } }

val inList = List(1, 2, 3)
val results = Future.traverse(inList)(asyncFunc)

results onSuccess { case outList =>
outList map {
case Success(s) => ...
case Failure(t) => ...
}
}

关于scala - 同步 2 个或更多 Future 的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20905569/

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