Scalaのスレッドプールの将来の大きさはどれくらいですか?先物のための微調整スレッドプールを設定するにはどうすればよいですか?
私のScalaアプリケーションでは何百万ものものがありますが、スレッドプールを構成することでそれらを最適化するために何かできることがあるのだろうかと思います。
ありがとうございます。
Scalaのスレッドプールの将来の大きさはどれくらいですか?先物のための微調整スレッドプールを設定するにはどうすればよいですか?
私のScalaアプリケーションでは何百万ものものがありますが、スレッドプールを構成することでそれらを最適化するために何かできることがあるのだろうかと思います。
ありがとうございます。
グローバルな暗黙の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) {}
}
グレート答えを管理する場合スリックへの暗黙的なのExecutionContextを提供する必要がありますなぜこれほどのThreadPool、 ExecutionContextのヘルパーメソッドを使用して、あるExecutorから直接インスタンス化できるようにして、定型文を少し減らすことができます。例: 暗黙的なval ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)) – monkjack
これはすべて役に立ちましたが、implicits.globalのスレッドには実際の制限がありますか?もしそうなら、これはapplication.conf経由でakkaのように設定できますか? – Nick
@ニックはい、implicits.globalはCPUコアあたり1つのスレッドしかありません。 CPUバインドされたタスクに最適です。しかし、古典的なIOをブロックする(例えば、jdbc)場合は、パフォーマンスが低下します。 –
この回答はmonkjackから受け付けた回答のコメントです。しかし、この素晴らしい答えが欠けているので、私はここでそれを再転記しています。
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
スレッドプールの数を変更するだけであれば、グローバルエグゼキュータを使用して、次のシステムプロパティを渡すだけです。
-Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
これはより洗練されたソリューションです –
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();
}
スリック3.0用途独自の接続と我々はそれが自身のスレッドプールに –