Es gibt eine Menge Fragen darüber, was / wie / was ist der beste Execution Context
, um Futures in Scala auszuführen und wie man den Dispatcher konfiguriert.
Trotzdem konnte ich nie eine längere Liste mit Vor- und Nachteilen und Konfigurationsbeispielen finden.
Das Beste, was ich finden konnte, war in der Akka-Dokumentation: Ссылка und Play Documentation Ссылка .
Ich möchte fragen, welche Konfigurationen neben den scala.concurrent.ExecutionContext.Implicits.global
und Akka-Standardwerten, die Sie in Ihren täglichen Dev-Leben verwenden, wenn Sie sie verwenden und was die Vor- und Nachteile sind.
Hier sind einige von denen, die ich bereits habe:
scala.concurrent.ExecutionContext.Implicits.global
Verwenden Sie, wenn Sie sich unsicher sind
Einfach zu verwenden
kann Ihre gesamte CPU verbrauchen
mehr Infos: Ссылка
ExecutionContext.fromExecutor(new ForkJoinPool(1))
play.api.libs.concurrent.Execution.Implicits._
scala.concurrent.ExecutionContext.Implicits.global
, wenn Sie Play geteilt
mehr Info: Ссылка
basierend auf der Konfiguration
mehr Info: Ссылка
Im Idealfall würden Sie nur mit nicht blockierendem Code den Framework-Ausführungskontext verwenden. Spielen Sie Frameworks oder Akkas.
Aber manchmal müssen Sie blockierende APIs verwenden. In einem Play Framework- und JDBC-Projekt befolgten wir deren Empfehlung [1] und setzten den Ausführungskontext auf 100 Threads und verwendeten den Standard einfach überall. Dieses System war sehr schnell für seine Verwendung und Bedürfnisse.
In einem anderen Akka-Projekt, in dem wir eine Mischung aus blockierendem und nicht blockierendem Code hatten, hatten wir separate Dispatcher, die für die verschiedenen Funktionen konfiguriert waren. Wie "blocking-dispatcher", "wichtig-feature-dispatcher" und "default-dispatcher". Dies lief gut, war aber komplexer als ein Dispatcher, wir mussten wissen / schätzen / überwachen, wie viel jeder benötigte. Wir haben es getestet und festgestellt, dass es bei 1 Thread zu langsam war, wenn wir 5 Threads hatten, war es besser, aber nach 10 Threads wurde es nicht schneller. Also haben wir es bei 10 Threads gelassen. Schließlich haben wir unseren Blockierungscode umstrukturiert und alles auf die Standardeinstellungen verschoben.
Aber jeder Anwendungsfall ist anders, Sie müssen Ihr System profilieren und überwachen, um zu wissen, was für Sie das Richtige ist. Wenn Sie alle nicht blockierenden Code haben, ist es einfach, es sollte 1 Thread pro CPU-Kern sein.
[1] Ссылка
Tags und Links scala concurrency akka playframework spray