Ist es schlechte Praxis ein Schauspieler eine Nachricht von etwas zu senden, die kein Schauspieler ist?

StackOverflow https://stackoverflow.com/questions/1058408

  •  21-08-2019
  •  | 
  •  

Frage

Angenommen, ich etwas Klasse haben, die eine Eigenschaft actor_ vom Typ Actor hat. Gibt es ein Problem mit mir zu tun

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

Oder sollten Sie eine Nachricht senden immer von einem anderen Akteur durchgeführt werden; z.

def someMethod() = {
  Actor.actor { actor_ ! "HELLO" }
}
War es hilfreich?

Lösung

Es hängt davon ab. Wenn Sie eine Nachricht an einen Schauspieler aus Nicht-Schauspieler Code wird ein ActorProxy automatisch erstellt und in einem lokalen Thread gespeichert. Dadurch entsteht ein Potential Speicherverlust, wenn auch sehr klein, weil die ActorProxy nicht GC'd werden, bis der Faden GC'd wird. Die ActorProxy ermöglicht im wesentlichen des nicht-Akteur Thread in vielerlei Hinsicht verhält sich wie ein Schauspieler, einschließlich Empfang Nachricht.

Das größere Problem ist, wenn der Thread, die Art und Weise ähnlich verwaltet wird die Schauspieler Bibliothek Threads verwaltet, so dass das, was stellt einen logischen Zusammenhang zu einer Zeit auf einem Thread sein kann und zu einem anderen Zeitpunkt auf einem anderen Thread sein. Ein gutes Beispiel hierfür wäre ein Servlet-Container sein. Ihr logischer Kontext kann ein Servlet oder eine Sitzung, aber die ActorProxy geht an den Thread gebunden zu sein, und damit über logische Zusammenhänge geteilt. Wenn Sie Ihre Schauspieler nicht auf die ActorProxy beantworten sind, ist dies nicht so eine große Sache, aber wenn sie es wahrscheinlich zu Problemen führen, weil entweder (a) die Antworten möglicherweise von falschem Kontext empfangen werden, oder (b) die Nachrichten nie empfangen werden, und damit die zuvor erwähnte kleines Leck wird ein großes wie die Postfächer der ActorProxies aufzufüllen.

[Bearbeiten] Hmm ... Ich scheine ein Problem Lesung Fragen zu haben! Umgeben schafft es in dem Schauspieler Block einen neuen Akteur Objekt, das richtig sein GC'd wird, wenn es beendet wird. Beachten Sie, dass die Nachricht setzt in einem Schauspieler Block senden bedeutet, dass die Nachricht zu senden wird in einer neuen Reaktion auf einem anderen Thread ausgeführt wird, nicht in dem Thread Schaffung die Schauspieler.

Andere Tipps

Ich sehe nicht ein Problem damit zu tun. Wenn es macht in Ihrem Code Sinn, warum nicht? Wenn man sich die reinen Schauspieler-Modell alles aussehen ist ein Schauspieler und nur Schauspieler sind miteinander communicatinng, wenn Sie Ihren Code wie this..great..if Design können Sie nicht können oder nicht wollen, dann ist es ok zu senden Nachrichten von nicht-Akteure Akteure.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top