81

Scala 的期货线程池有多大?

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

谢谢你。

4

4 回答 4

157

这个答案来自monkjack,来自已接受答案的评论。但是,人们可能会错过这个很棒的答案,所以我在这里重新发布。

implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))

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

-Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
于 2014-06-11T23:04:42.677 回答
90

您可以指定自己的 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) {}
}
于 2013-03-08T02:00:46.740 回答
3

在 Scala 期货中指定线程池的最佳方法:

implicit val ec = new ExecutionContext {
      val threadPool = Executors.newFixedThreadPool(conf.getInt("5"));
      override def reportFailure(cause: Throwable): Unit = {};
      override def execute(runnable: Runnable): Unit = threadPool.submit(runnable);
      def shutdown() = threadPool.shutdown();
    }
于 2015-08-24T05:32:26.647 回答
0
class ThreadPoolExecutionContext(val executionContext: ExecutionContext)

object ThreadPoolExecutionContext {

  val executionContextProvider: ThreadPoolExecutionContext = {
    try {
      val executionContextExecutor: ExecutionContextExecutor = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(25))
      new ThreadPoolExecutionContext(executionContextExecutor)
    } catch {
      case exception: Exception => {
        Log.error("Failed to create thread pool", exception)
        throw exception
      }
    }
  }
}
于 2020-05-29T10:57:23.633 回答