web-dev-qa-db-ja.com

先物のために細かく調整されたスレッドプールを構成する方法

Scalaの先物のスレッドプールはどれくらいの大きさですか?

My Scalaアプリケーションは数百万のfuture {}sそして、スレッドプールを構成することで最適化するためにできることはないかと思います。

ありがとうございました。

75
user972946

グローバルな暗黙的なExecutionContextをインポートする代わりに、futureが実行される独自の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) {}
}
86
Josh Gao

この回答は、受け入れられた回答からのコメントであるmonkjackからのものです。ただし、このすばらしい回答を見逃す可能性があるため、ここに再投稿しています。

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

スレッドプール数を変更するだけの場合は、グローバルエグゼキュータを使用して、次のシステムプロパティを渡すだけです。

-Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
136

scala futuresでスレッドプールを指定する最良の方法:

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();
    }
3