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) {}
}
이 답변은 수락 된 답변의 의견 인 monkjack의 것입니다. 그러나이 훌륭한 답변을 놓칠 수 있으므로 여기에 다시 게시하고 있습니다.
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
스레드 풀 수만 변경해야하는 경우 전역 실행기를 사용하고 다음 시스템 속성을 전달하면됩니다.
-Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
스칼라 선물에서 스레드 풀을 지정하는 가장 좋은 방법 :
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
}
}
}
}