Scala-Darsteller: Empfangen gegen Reagieren

Lassen Sie mich zunächst sagen, dass ich ziemlich viel Java-Erfahrung habe, mich aber erst seit kurzem für funktionale Sprachen interessiere. Vor kurzem habe ich angefangen, mir Scala anzuschauen, was wie eine sehr schöne Sprache aussieht.

Ich habe jedoch über das Actor-Framework von Scala in gelesenProgrammieren in ScalaUnd eines verstehe ich nicht. In Kapitel 30.4 steht, dass usingreact anstattreceive Ermöglicht die Wiederverwendung von Threads, was sich positiv auf die Leistung auswirkt, da Threads in der JVM teuer sind.

Heißt das, solange ich mich erinnere anzurufenreact anstattreceiveKann ich so viele Schauspieler starten, wie ich möchte? Bevor ich Scala entdeckte, habe ich mit Erlang und dem Autor von gespieltProgrammierung Erlang rühmt sich damit, über 200.000 Prozesse zu erzeugen, 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 Taskwechsel statt? Wenn ich beispielsweise zwei Akteure starte, die sich gegenseitig Ping-Pong-Nachrichten senden, riskiere ich dann einen Deadlock, wenn sie im selben Thread gestartet werden?

GemäßProgrammieren in ScalaSchreiben von Schauspielern zur Verwendungreact ist schwieriger als mitreceive. Das klingt plausibel, dareact kommt nicht zurück. Das Buch zeigt jedoch weiter, wie Sie einereact innerhalb einer Schleife mitActor.loop. Als Ergebnis erhalten Sie

loop {
    react {
        ...
    }
}

das scheint mir ziemlich ähnlich zu sein

while (true) {
    receive {
        ...
    }
}

was früher in dem Buch verwendet wird. Dennoch heißt es in dem Buch, dass "in der Praxis für Programme mindestens einige benötigt werden"receiveAlso, was fehle ich hier? Was kann ich?receive TU dasreact kann nicht, außer zurückkehren? Und warum kümmert es mich?

Schließlich komme ich zum Kern dessen, was ich nicht verstehe: Das Buch erwähnt immer wieder, wie man es benutztreact Ermöglicht das Verwerfen des Aufrufstapels zur Wiederverwendung des Threads. Wie funktioniert das? Warum muss der Aufrufstapel verworfen werden? Und warum kann der Aufrufstapel verworfen werden, wenn eine Funktion durch Auslösen einer Ausnahme beendet wird (react), aber nicht, wenn es durch Zurückgeben beendet wird (receive)?

Ich habe den Eindruck, dassProgrammieren in Scala Ich habe einige der Hauptthemen hier beschönigt, was sehr schade ist, da es sich ansonsten um ein wirklich hervorragendes Buch handelt.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage