Наскільки великий пул потоків Scala для ф’ючерсів?
Мій додаток Scala робить багато мільйонів future {}
с, і мені цікаво, чи можу я щось зробити для їх оптимізації, налаштувавши пул потоків.
Дякую.
Наскільки великий пул потоків Scala для ф’ючерсів?
Мій додаток Scala робить багато мільйонів future {}
с, і мені цікаво, чи можу я щось зробити для їх оптимізації, налаштувавши пул потоків.
Дякую.
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, на який будуть працювати ваші ф’ючерси, замість того, щоб імпортувати загальний неявний 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
найкращий спосіб вказати пул потоків у ф'ючерсах 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();
}
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
}
}
}
}