gpt4 book ai didi

scala - 如何安全地重试 Scala Future?

转载 作者:行者123 更新时间:2023-12-04 02:14:05 24 4
gpt4 key购买 nike

我有一些代码可以启动一个“缓慢”过程,我将其包装在 Future 中。如果出现问题,我想慢慢循环并在暂停后重试 - 无限期。有点像这样:(我知道最终人类会介入并解决问题)

  def doSomething():Unit = {
aFutureThing().onComplete {
case Success(s) => println("Success: "+s)
case Failure(x) =>
// Take some (hopefully) corrective action here, call for help, etc.
Thread.sleep(1000) // pause a bit
doSomething() // and try again...
}
}
doit()

当 onComplete 回调被调用时,doSomething() 是否仍在堆栈中,还是因为我们在 Future 执行慢任务 (aFutureThing) 时已经返回而被弹出?这种对 doSomething 的递归调用(最终)会炸毁堆栈/OutOfMemory 还是什么?如果是这样......有没有更安全的方法来重试 future ?

最佳答案

这里没有递归。 doSomething 将创建 Future 并立即返回,而 Future 被提交以在另一个线程上执行(它实际上可能在同一线程上执行,如果它是池的一部分,但不会在 doSomething 返回之前。

你可以通过在 repl 中运行这样的东西来亲眼看到这一点:

def foo(n: Int): Future[Int] = Future {
Thread.sleep(1000)
if(n < 10) throw new IllegalArgumentException(); else n
} recoverWith { case e =>
e.printStackTrace();
println("N was " + n)
Thread.sleep(1000)
println("Rinse and repeat!")
foo(n+1)
}

foo(1)

它会在真正成功之前“重试”9 次,并且每次都打印异常的堆栈,因此您可以看到回溯是相同的,它们不会增长,因为没有递归。

关于scala - 如何安全地重试 Scala Future?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35616090/

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