Frage an actor, scala – Ist es eine schlechte Praxis, einem Schauspieler eine Nachricht von etwas zu senden, das kein Schauspieler ist?

10

Angenommen, ich habe eine Klasse, die eine Eigenschaft hatactor_ vom TypActor. Gibt es ein Problem mit mir?

def someMethod() = {
  actor_ ! "HELLO"
}

Oder sollte das Senden einer Nachricht immer von einem anderen Schauspieler erfolgen? z.B.

def someMethod() = {
  Actor.actor { actor_ ! "HELLO" }
}

Deine Antwort

2   die antwort
8

ob. Wenn Sie eine Nachricht aus einem Nicht-Akteur-Code an einen Akteur senden, wird automatisch ein Akteur-Proxy erstellt und in einem lokalen Thread gespeichert. Dies führt zu einem potenziellen Speicherverlust, wenn auch einem sehr kleinen, da ActorProxy erst dann gecodet wird, wenn der Thread gecodet ist. Der ActorProxy ermöglicht es dem Nicht-Actor-Thread in vielerlei Hinsicht, sich wie ein Actor zu verhalten, einschließlich des Empfangs von Nachrichten.

Das größere Problem besteht darin, dass Ihr Thread verwaltet wird, ähnlich wie die Actor-Bibliothek Threads verwaltet, sodass sich das, was einen logischen Kontext darstellt, zu einem Zeitpunkt auf einem Thread und zu einem anderen Zeitpunkt auf einem anderen Thread befinden kann. Ein gutes Beispiel hierfür wäre ein Servlet-Container. Ihr logischer Kontext kann ein Servlet oder eine Sitzung sein, aber der ActorProxy wird an den Thread gebunden und somit über logische Kontexte hinweg gemeinsam genutzt. Wenn Ihre Darsteller nicht auf ActorProxy antworten, ist dies keine so große Sache, aber wenn dies der Fall ist, wird dies wahrscheinlich zu Problemen führen, da entweder (a) die Antworten möglicherweise im falschen Kontext eingehen oder (b) die Nachrichten werden nie empfangen, und so wird das zuvor erwähnte kleine Leck zu einem großen, wenn die Postfächer der ActorProxies voll sind.

[Bearbeiten] Hmm ... Ich habe anscheinend Probleme beim Lesen von Fragen! Wenn Sie es im Akteurblock umgeben, wird ein neues Akteurobjekt erstellt, das beim Beenden ordnungsgemäß gecodet wird. Beachten Sie, dass das Versenden der Nachricht in einen Akteurblock bedeutet, dass das Versenden der Nachricht in einer neuen Reaktion auf einen anderen Thread erfolgt, nicht in dem Thread, der den Akteur erstellt.

Tolle Antwort, Eric, danke. Tritt das gleiche Problem auf, wenn der Aufruf in einen "actor {}" -Block (wie in meiner Frage) eingeschlossen wird? Oder ist der erstellte Akteur GC-fähig, wenn der Block beendet wird, unabhängig davon, ob der Thread weiterlebt? oxbow_lakes
0

warum dann nicht? Wenn Sie sich das reine Schauspielermodell ansehen, ist alles ein Schauspieler und nur Schauspieler kommunizieren miteinander. Wenn Sie Ihren Code so gestalten können, ist es in Ordnung, ihn zu senden, wenn Sie nicht können oder wollen Nachrichten von Nicht-Akteuren an Akteure.

Ich bin mir nicht sicher. Was wäre denn in der Reaktion "Absender"? oxbow_lakes
Sender wäre ein implizit erstellter ActorProxy, der jetzt an den sendenden Thread gebunden ist. Erik Engbrecht

Verwandte Fragen