¿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.
¿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.
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) {}
}
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
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();
}
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
}
}
}
}