Wie groß ist Scalas Thread-Pool für Futures?
Meine Scala-Anwendung macht viele Millionen future {}
s und ich frage mich, ob ich irgendetwas tun kann, um sie durch Konfigurieren eines Thread-Pools zu optimieren.
Vielen Dank.
Wie groß ist Scalas Thread-Pool für Futures?
Meine Scala-Anwendung macht viele Millionen future {}
s und ich frage mich, ob ich irgendetwas tun kann, um sie durch Konfigurieren eines Thread-Pools zu optimieren.
Vielen Dank.
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.
Antworten:
Sie können Ihren eigenen ExecutionContext angeben, in dem Ihre Futures ausgeführt werden, anstatt den globalen impliziten ExecutionContext zu importieren.
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) {}
}
Diese Antwort stammt von Monkjack, einem Kommentar aus der akzeptierten Antwort. Man kann diese großartige Antwort jedoch übersehen, also poste ich sie hier neu.
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))
Wenn Sie nur die Anzahl der Thread-Pools ändern müssen, verwenden Sie einfach den globalen Executor und übergeben Sie die folgenden Systemeigenschaften.
-Dscala.concurrent.context.numThreads=8 -Dscala.concurrent.context.maxThreads=8
Der beste Weg, um Threadpool in Scala-Futures anzugeben:
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
}
}
}
}