gpt4 book ai didi

斯卡拉 future 。如果其中一个失败则采取行动

转载 作者:行者123 更新时间:2023-12-01 11:24:47 25 4
gpt4 key购买 nike

我有一种情况,我想作为 future 并发执行多个任务,这样如果其中一个任务失败,其他任务仍然会执行。如果失败,我想记录它的错误。我希望我的父线程能够判断每个线程是否成功,然后根据它执行一些操作。例如,如果其中一个 future 失败了,打印“嘿,其中一个 future 失败了”

val futureA = Future(doTaskThatReturnsABoolean)
val futureB = Future(doTaskThatReturnsABoolean)
val futureC = Future(doTaskThatReturnsABoolean)

futureA.onFailure (case t => println(future A failed ) + t.getMessage)
futureB.onFailure (case t => println(future B failed ) + t.getMessage)
futureC.onFailure (case t => println(future C failed ) + t.getMessage)

if (one of these futures failed) {
println("One of the futures failed")
throw new someNewError
}

如果任何或所有 future 失败,我想记录它们的堆栈跟踪,但我不想在所有 future 都有机会运行之前导致我的整个程序出错。因为他们都可能因为不同的原因而出错,我不想重复他们的错误,我想抛出一个新的错误。

我一直在阅读 http://docs.scala-lang.org/overviews/core/futures.html但就是无法理解这个问题。

我不想使用“等待”,因为这需要时间,我想给 future 尽可能多的时间来运行。现在让我们假设它们“将”完成,但时间不确定,时间完全取决于数据大小。

最佳答案

应该是这样的:

val futureA = Future(doTaskThatReturnsABoolean).recoverWith{
case e:Throwable => println(future A failed ) + t.getMessage; Future.failed(e)
}
val futureB = Future(doTaskThatReturnsABoolean).recoverWith{
case e:Throwable => println(future B failed ) + t.getMessage; Future.failed(e)
}
val futureC = Future(doTaskThatReturnsABoolean).recoverWith{
case e:Throwable => println(future failed ) + t.getMessage; Future.failed(e)
}

val futures = List(futureA, futureB, futureC)
Future.sequence(futures).recoverWith{
case p:Throwable => println("One of the futures failed"); Future.failed(new SomeNewError)
}

Future.sequence 帮助器方法将 future 集合转换为 future 包装结果集合。如果其中一个源 Future 失败,则由此产生的 Future 将失败。

关于斯卡拉 future 。如果其中一个失败则采取行动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38440126/

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