【问题标题】:Program not terminating when using Futures使用期货时程序未终止
【发布时间】:2020-11-03 03:37:29
【问题描述】:

我正在尝试对目录中的每个文件同时运行一个函数。可悲的是,每当我使用 Futures 时,我的程序都不想终止(永远运行)。我尝试使用Await.result() 得到相同的结果:/

运行代码时,它执行得很好,甚至“完成?”被打印出来然后挂起……

这是我的代码。 (我是 Scala 新手)

val execService = Executors.newFixedThreadPool(3)
implicit val execContext = ExecutionContext.fromExecutorService(execService)

val futures = for (file <- filesList) yield Future {
   println(file)
   // theFunc(file)
}
val seq = Future.sequence(futures)
seq.onComplete {
   case Success(x) => println("finish?")
   case Failure(e) => println(e)
}

【问题讨论】:

  • 试试Await.ready(Future.traverse(filesList)(theFunc), Duration.Inf),其中theFunc已经返回了一个Future
  • 感谢您的回复,遗憾的是我仍然无法终止它:/

标签: scala file concurrency future


【解决方案1】:

Executors.newFixedThreadPool 在后台使用 defaultThreadFactory 创建非守护线程

返回用于创建新线程的默认线程工厂。这 factory 在同一个 Executor 中创建所有新线程 ThreadGroup...每个新线程都被创建为非守护线程

因为这些是非守护线程,所以程序不会终止。另一方面,例如scala.concurrent.ExecutionContext.Implicits.global 创建daemon 线程

val threadFactory = new DefaultThreadFactory(daemonic = true,
                                             maxBlockers = getInt("scala.concurrent.context.maxExtraThreads", "256"),
                                             prefix = "scala-execution-context-global",
                                             uncaught = (thread: Thread, cause: Throwable) => reporter(cause))

我们注意到daemonic = true,所以下面的程序将在最后终止

implicit val execContext = scala.concurrent.ExecutionContext.Implicits.global

val futures = for (file <- filesList) yield Future {
   println(file)
   // theFunc(file)
}
...

基于

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-12
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 2011-09-19
    相关资源
    最近更新 更多