2013-03-08 10 views
63

Scalaのスレッドプールの将来の大きさはどれくらいですか?先物のための微調整スレッドプールを設定するにはどうすればよいですか?

私のScalaアプリケーションでは何百万ものものがありますが、スレッドプールを構成することでそれらを最適化するために何かできることがあるのだろうかと思います。

ありがとうございます。

+0

スリック3.0用途独自の接続と我々はそれが自身のスレッドプールに –

答えて

75

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

グレート答えを管理する場合スリックへの暗黙的なのExecutionContextを提供する必要がありますなぜこれほどのThreadPool、 ExecutionContextのヘルパーメソッドを使用して、あるExecutorから直接インスタンス化できるようにして、定型文を少し減らすことができます。例: 暗黙的なval ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)) – monkjack

+1

これはすべて役に立ちましたが、implicits.globalのスレッドには実際の制限がありますか?もしそうなら、これはapplication.conf経由でakkaのように設定できますか? – Nick

+4

@ニックはい、implicits.globalはCPUコアあたり1つのスレッドしかありません。 CPUバインドされたタスクに最適です。しかし、古典的なIOをブロックする(例えば、jdbc)場合は、パフォーマンスが低下します。 –

112

この回答はmonkjackから受け付けた回答のコメントです。しかし、この素晴らしい答えが欠けているので、私はここでそれを再転記しています。

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

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

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

これはより洗練されたソリューションです –

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(); 
    } 
関連する問題