如何为期货配置微调线程池?

77 parallel-processing multithreading scala future threadpool

Scala的期货线程池有多大?

我的Scala应用程序创建了数百万future {}s,我想知道我是否可以通过配置线程池来优化它们.

谢谢.

Bie*_*vid 139

这个答案来自monkjack,来自公认答案的评论.然而,人们可以错过这个伟大的答案,所以我在这里重新发布.

implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
Run Code Online (Sandbox Code Playgroud)

如果您只需要更改线程池计数,只需使用全局执行程序并传递以下系统属性.

-Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更优雅的解决方案 (2认同)

Jos*_*Gao 87

您可以指定您的期货将运行的自己的ExecutionContext,而不是导入全局隐式ExecutionContext.

import java.util.concurrent.Executors
import scala.concurrent._

implicit val ec = new ExecutionContext {
    val threadPool = Executors.newFixedThreadPool(1000)

    def execute(runnable: Runnable) {
        threadPool.submit(runnable)
    }

    def reportFailure(t: Throwable) {}
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,您可以通过使用ExecutionContext上的帮助器方法来减少样板,使您可以直接从给定的Executor实例化.例如,隐式val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)) (69认同)
  • @Nick是的,implicits.global每个CPU核心只有1个线程.最适合cpu绑定的任务.但对于经典的阻塞IO(例如jdbc)来说,这是一场性能灾难. (6认同)
  • 使用此方法后,我需要添加一个关闭线程池的调用,否则程序将永远不会终止... def shutdown()= threadPool.shutdown() (2认同)
  • 为什么在“正常”情况下关闭它,而在将隐式设置为其他值时却不关闭呢? (2认同)