Scala의 선물용 스레드 풀은 얼마나 큽니까?
내 Scala 애플리케이션은 수백만 개의 future {}
s를 생성하며 스레드 풀을 구성하여 최적화 할 수있는 방법이 있는지 궁금합니다.
감사합니다.
답변
전역 암시 적 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
}
}
}
}
답변
