Lassen Sie mich zunächst sagen, dass ich viel Java-Erfahrung habe, mich aber erst seit kurzem für funktionale Sprachen interessiere. Vor kurzem habe ich angefangen, mir Scala anzuschauen, was eine sehr schöne Sprache zu sein scheint.
Ich habe jedoch über Scalas Actor-Framework in Programmieren in Scala gelesen , und eines verstehe ich nicht. In Kapitel 30.4 heißt es, dass die Verwendung von react
anstelle von receive
die Wiederverwendung von Threads ermöglicht, was sich positiv auf die Leistung auswirkt, da Threads in der JVM teuer sind.
Bedeutet dies , dass, solange ich zu nennen erinnern react
statt receive
, kann ich so viele Schauspieler , wie ich wie anfangen? Bevor ich Scala entdeckte, habe ich mit Erlang gespielt, und der Autor von Programming Erlang rühmt sich, über 200.000 Prozesse hervorgebracht zu haben, ohne ins Schwitzen zu geraten. Ich würde es hassen, das mit Java-Threads zu tun. Welche Grenzen sehe ich in Scala im Vergleich zu Erlang (und Java)?
Wie funktioniert die Wiederverwendung dieses Threads in Scala? Nehmen wir der Einfachheit halber an, dass ich nur einen Thread habe. Werden alle Akteure, die ich starte, nacheinander in diesem Thread ausgeführt, oder findet eine Art Aufgabenwechsel statt? Wenn ich zum Beispiel zwei Schauspieler starte, die sich gegenseitig Ping-Pong-Nachrichten senden, riskiere ich dann einen Deadlock, wenn sie im selben Thread gestartet werden?
Laut Programming in Scala ist das Schreiben von Schauspielern react
schwieriger als mit receive
. Das klingt plausibel, da react
es nicht zurückkommt. Das Buch zeigt jedoch weiter, wie Sie mit react
in eine Schleife einfügen können Actor.loop
. Als Ergebnis erhalten Sie
loop {
react {
...
}
}
was mir ziemlich ähnlich erscheint
while (true) {
receive {
...
}
}
welches früher in dem Buch verwendet wird. Dennoch heißt es in dem Buch, dass "in der Praxis Programme mindestens einige benötigen receive
". Was vermisse ich hier? Was kann receive
das react
nicht, außer zurückkehren? Und warum kümmert es mich?
Kommen wir zum Kern dessen, was ich nicht verstehe: Das Buch erwähnt immer wieder, wie die Verwendung react
es ermöglicht, den Aufrufstapel zu verwerfen, um den Thread wiederzuverwenden. Wie funktioniert das? Warum muss der Aufrufstapel verworfen werden? Und warum kann der Aufrufstapel verworfen werden, wenn eine Funktion durch Auslösen einer Ausnahme ( react
) beendet wird, aber nicht, wenn sie durch Rückgabe ( receive
) beendet wird ?
Ich habe den Eindruck, dass das Programmieren in Scala einige der wichtigsten Themen hier beschönigt hat, was schade ist, denn ansonsten ist es ein wirklich ausgezeichnetes Buch.