¿Qué tan grande es el grupo de subprocesos de Scala para futuros?
Mi aplicación Scala genera muchos millones de future {}
sy me pregunto si hay algo que pueda hacer para optimizarlos configurando un grupo de subprocesos.
Gracias.
multithreading
scala
parallel-processing
threadpool
future
Erik Kaplun
fuente
fuente
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.
Respuestas:
Puede especificar su propio ExecutionContext en el que se ejecutarán sus futuros, en lugar de importar el ExecutionContext implícito global.
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) {} }
fuente
Esta respuesta es de monkjack, un comentario de la respuesta aceptada. Sin embargo, uno puede perderse esta gran respuesta, así que la estoy volviendo a publicar aquí.
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
Si solo necesita cambiar el recuento del grupo de subprocesos, simplemente use el ejecutor global y pase las siguientes propiedades del sistema.
-Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
fuente
la mejor manera de especificar la agrupación de subprocesos en futuros de 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(); }
fuente
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 } } } }
fuente