Ausführungskontext und Dispatcher - Best Practices, nützliche Konfigurationen und Dokumentation

8

Scala Execution Context und Dispatcher - Listing und Vergleich: Warum?

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:

Erste unvollendete Übersicht

Standard: scala.concurrent.ExecutionContext.Implicits.global

  • Verwenden Sie, wenn Sie sich unsicher sind

  • Einfach zu verwenden

  • für alles geteilt
  • kann Ihre gesamte CPU verbrauchen

  • mehr Infos: Ссылка

Testen - ExecutionContext.fromExecutor(new ForkJoinPool(1))

  • zum Testen verwenden
  • keine Parallelität

Play's Standard-EC - play.api.libs.concurrent.Execution.Implicits._

  • Verwenden Sie anstelle von scala.concurrent.ExecutionContext.Implicits.global , wenn Sie Play
  • verwenden
  • Standardwiedergabe
  • geteilt

  • mehr Info: Ссылка

Akkas standardmäßiger Ausführungskontext

Abschottung

%Vor%     
Andreas Neumann 06.12.2015, 12:10
quelle

1 Antwort

1

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] Ссылка

    
Stephen 18.05.2017 10:07
quelle