Ich komme aus Java, wo ich Runnable
s an eine ExecutorService
übergeben würde, die von einem Thread-Pool unterstützt wird. Es ist sehr klar in Java, wie man die Größe des Thread-Pools begrenzt.Wie kann Nebenläufigkeit bei der Verwendung von Scala-Akteuren begrenzt werden?
Ich bin daran interessiert, Scala-Akteure zu verwenden, aber ich bin unklar, wie Sie die Nebenläufigkeit begrenzen können.
Sagen wir einfach, hypothetisch, dass ich einen Webdienst erstelle, der "Jobs" akzeptiert. Ein Job wird mit POST
Anforderungen gesendet, und ich möchte, dass mein Dienst den Job in die Warteschlange einreiht und dann sofort 202 Accepted
zurückgibt - d. H. Die Jobs werden asynchron verarbeitet.
Wenn ich Schauspieler verwende, um die Jobs in der Warteschlange zu verarbeiten, wie kann ich die Anzahl gleichzeitiger Jobs begrenzen, die verarbeitet werden?
Ich kann mir ein paar verschiedene Möglichkeiten vorstellen, dies zu erreichen; Ich frage mich, ob es eine Community Best Practice oder zumindest einige klar etablierte Ansätze gibt, die in der Scala-Welt etwas Standard sind.
Ein Ansatz, an den ich gedacht habe, ist ein einziger Koordinatorakteur, der die Jobwarteschlange und die jobverarbeitenden Akteure verwaltet; Ich nehme an, es könnte ein einfaches int-Feld verwenden, um zu verfolgen, wie viele Jobs gerade verarbeitet werden. Ich bin mir aber sicher, dass es bei diesem Ansatz einige Probleme geben würde, wie zum Beispiel, dass man nachverfolgen muss, wenn ein Fehler auftritt, um die Anzahl zu verringern. Deshalb frage ich mich, ob Scala bereits einen einfacheren oder besser eingekapselten Ansatz bietet.
BTW Ich habe versucht, diese Frage a while ago zu stellen, aber ich fragte es schlecht.
Danke!
Sehr nützlich, danke! Ich bin mir nicht sicher, ob ich den Begriff _Throttle_ verwenden würde, aber es gibt Zeiten, in denen man die Anzahl der gleichzeitigen "Prozesse" beschränken muss, weil ihre Arbeit ressourcenintensiv ist. –
Dieser Ansatz liefert möglicherweise nicht das gewünschte Ergebnis. Dadurch können Jobs in die Warteschlange gestellt werden, bis die JVM nicht mehr genügend Arbeitsspeicher hat. Wenn Sie die Anzahl der Threads beschränken, die von den Akteuren verwendet werden können, wird die Anzahl der Jobs, die gleichzeitig ausgeführt werden, begrenzt. Ich habe OOM-Fehler erzeugt, indem ich schneller als die Schauspieler Arbeit erzeugt habe, also muss man vorsichtig sein. –
Ich denke, ein Nachteil dieses Ansatzes ist, dass es global ist. Manchmal habe ich verschiedene Arten von Prozessen, die ich ausführen muss, die unterschiedliche Ebenen der Ressourcennutzung haben - mit Java-Thread-Pools kann ich leicht verschiedene Pools mit unterschiedlichen Einstellungen verwenden. Mit 'actors.maxPoolSize' kann ich nur eine einzige Zahl für alle Darsteller verwenden, da sie alle aus demselben Thread-Pool stammen, oder? –