2016-12-27 10 views
0
  1. Meist verwendet akka primitiv Actor - irgendwelche Zustandsänderungen oder Zustandsabfragen werden ausschließlich über Asynchron-Nachrichten erfolgen.akka: Kombination von Schauspieler und Agenten

  2. Akka stellt auch das weniger bekannte Primitiv Agent zur Verfügung, das asynchron durch einen neuen Wert aktualisiert wird (oder durch eine Funktion, die seinen Wert modifiziert) und synchron von jedem Thread gelesen werden kann.

Frage: In Single-JVM Schauspieler System, wie diese Ansätze kombinieren: haben primitive, die von Asynchron aktualisiert wird. nur Nachrichten (wie Actor), aber welcher Zustand kann direkt in thread-sicherer Weise (wie Agent) gelesen werden?

Ich würde wirklich schätzen Verbindung zu jeder relevanten Diskussion/Projekt/Probe.

Lösungen die ich bisher gefunden:

  1. offensichtliche Möglichkeit ist Actor zu haben, die Agent in aktualisiert. Aber ich frage mich, ob es elegantere & performante Lösung gibt.
  2. Scalaz Agent, aber eine Lösung ohne Scalaz-Abhängigkeit wäre bevorzugt.
  3. Halbwegs schmutzige Lösung: Pause Actor Trennung durch Veröffentlichung (in ausgehenden Nachricht) -Funktion zum Lesen des Status des Schauspielers, ähnlich Agent.get(). Die Fadensicherheit muss manuell sichergestellt werden.
  4. Work around: lassen Sie Actor aktualisieren einige externe freigegebenen Zustand in . Die Fadensicherheit muss manuell sichergestellt werden.

Antwort

1

Hinweis, dass die Agenten haben als gekennzeichnet veraltete vom Akka-Team und wird bei der nächsten Hauptversion (wahrscheinlich 2.5.0) entfernt werden. This ist das entsprechende Ticket.

In der Tat ist die Kernidee von Akka, asynchrone Kommunikation zu fördern, also denke ich, Agenten aus dieser Perspektive macht Sinn.

Eine alternative Lösung könnte darin bestehen, einen Actor zu verwenden und asynchron auf seinen Status zuzugreifen. Wenn dieses Szenario Sie betrifft, wie eine Get Nachricht möglicherweise warten muss, bis einige wenige Update Nachrichten verarbeitet werden, können Sie erwägen, eine Priority Mailbox zu verwenden, um Get Nachrichten zuerst zu verarbeiten. Beispiel here.

Verwandte Themen