gpt4 book ai didi

scala - 使用 Scalaz Futures 和定时函数时如何正确退出程序

转载 作者:行者123 更新时间:2023-12-05 01:02:44 25 4
gpt4 key购买 nike

这按预期工作:

object Planexecutor extends App {    
import scalaz.concurrent.Future
import scala.concurrent.duration._

val f = Future.apply(longComputation)
val result = f.run
println(result)
}

这不会:
object Planexecutor extends App {    
import scalaz.concurrent.Future
import scala.concurrent.duration._

val f = Future.apply(longComputation).timed(1.second)
val result = f.run
println(result)
}

在第一种情况下,应用程序会正常退出,而在第二种情况下则不会。但是,两个版本都正确打印出结果值。

这是一个错误还是有什么我不明白的地方?

最佳答案

问题在于 timed 的线程池正在使用。如果你看 source你可以看到它使用了默认值 Strategy.DefaultTimeoutScheduler这只是一个通用的 java 线程池,它的线程没有设置为守护进程状态。 Future.apply的默认线程池它的线程集上确实有守护进程状态,因此 JVM 将正确关闭。要解决此问题,您可以在代码完成后手动关闭线程池:

  scalaz.concurrent.Strategy.DefaultTimeoutScheduler.shutdown()

或者你可以传递一个不同的线程池:
  val newTimeOutScheduler = Executors.newScheduledThreadPool(1, new ThreadFactory {
val defaultThreadFactory = Executors.defaultThreadFactory()
def newThread(r: Runnable) = {
val t = defaultThreadFactory.newThread(r)
t.setDaemon(true)
t
}
})

val f = Future.apply(longComputation).timed(1.second)(newTimeOutScheduler)

您还可以通过隐式来管理它,这样您就不必手动添加:
  implicit val newTimeOutScheduler = Executors.newScheduledThreadPool(1, new ThreadFactory {
val defaultThreadFactory = Executors.defaultThreadFactory()
def newThread(r: Runnable) = {
val t = defaultThreadFactory.newThread(r)
t.setDaemon(true)
t
}
})

val f = Future.apply(longComputation).timed(1.second)

更新:
这是一个非常简单的修复,所以我做了一个 pull request.

关于scala - 使用 Scalaz Futures 和定时函数时如何正确退出程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25879496/

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