先物用のScalaのスレッドプールはどのくらいですか?
私のScalaアプリケーションは何百万ものfuture {}
sを作成しますが、スレッドプールを構成してそれらを最適化するために何かできることはないかと思います。
ありがとうございました。
先物用のScalaのスレッドプールはどのくらいですか?
私のScalaアプリケーションは何百万ものfuture {}
sを作成しますが、スレッドプールを構成してそれらを最適化するために何かできることはないかと思います。
ありがとうございました。
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.
回答:
グローバルな暗黙の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) {}
}
この回答は、受け入れられた回答からのコメントであるモンクジャックからのものです。ただし、このすばらしい答えを見逃す可能性があるため、ここに再投稿します。
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
スレッドプール数を変更する必要がある場合は、グローバルエグゼキュータを使用して、次のシステムプロパティを渡します。
-Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
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();
}
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
}
}
}
}