Jak duża jest pula wątków Scali dla kontraktów terminowych?
Moja aplikacja Scala zarabia wiele milionów future {}
i zastanawiam się, czy jest coś, co mogę zrobić, aby je zoptymalizować, konfigurując pulę wątków.
Dziękuję Ci.
multithreading
scala
parallel-processing
threadpool
future
Erik Kaplun
źródło
źródło
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.
Odpowiedzi:
Możesz określić własny ExecutionContext, w którym będą działać Twoje futures, zamiast importować globalny niejawny 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) {} }
źródło
Ta odpowiedź pochodzi z monkjack, komentarz z zaakceptowanej odpowiedzi. Można jednak przegapić tę świetną odpowiedź, więc zamieszczam ją tutaj.
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
Jeśli potrzebujesz tylko zmienić liczbę puli wątków, po prostu użyj globalnego modułu wykonawczego i przekaż następujące właściwości systemowe.
-Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
źródło
najlepszy sposób na określenie Threadpool w 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(); }
źródło
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 } } } }
źródło