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


80

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

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

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


Slick 3.0は独自の接続とスレッドプールを使用するので、独自のスレッドプールを管理するときに
slickに

1
@RahulGulabaniから「必須滑らかな」ブック:The reason is that map, flatMap methods of Action allows you to call arbitrary code when joining the actions together. Slick cannot allow that code to be run on its own execution context, because it has no way to know if you are going to tie up Slicks threads for a long time.
srzhio

回答:


90

グローバルな暗黙の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) {}
}

73
すばらしい答えです。ExecutionContextのヘルパーメソッドを使用して、特定のエグゼキューターから直接インスタンス化することで、ボイラープレートを少し減らすことができます。例:implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
sksamuel 2013

1
これはすべて素晴らしいことですが、implicits.globalのスレッドには実際の制限がありますか?もしそうなら、これはapplication.confを介してakkaのように構成可能ですか?
ニック

6
@Nickはい、implicits.globalはCPUコアごとに1スレッドのみです。CPUバウンドタスクに最適です。ただし、従来のブロッキングIO(jdbcなど)の場合、パフォーマンスが低下します。
ベンハッチソン2014年

2
これを使用した後、スレッドプールをシャットダウンする呼び出しを追加する必要がありました。そうしないと、プログラムが終了しません... def shutdown()= threadPool.shutdown()
justinhj 2015年

2
「通常の」場合にシャットダウンするのに、暗黙を他の何かに設定した場合にはシャットダウンしないのはなぜですか?
hbogert 2015

152

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

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

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

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

2
これはよりエレガントなソリューションです
Ben Hutchison 2014年

値を5にして両方を試しましたが、最大8つのスレッドが同時に実行されています。
micseydel

3

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

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
      }
    }
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.