Frage

Ich mag Schauspieler in einem Programm verwenden, wo ich eine Art von Einschränkung einige der Akteure um die Behandlung, als ob sie Warteschlangen waren haben werden. Angenommen, ich habe einige externe System auf die Ereignisse ändern angewendet werden und auch einige Cache der Daten des externen Systems. So habe ich 2 Schauspieler:

  1. ChangeApplicationActor
  2. CacheActor

Im Rahmen der ChangeApplicationActor, wenn ich eine Änderung zu einem gewissen Einheit X im externen System anwenden, mag ich ein Ereignis senden, um die CacheActor zu sagen, zu synchronisieren:

val changeApplicationActor = actor { 
  loop {
    react {
      case ChangeInstruction(x) => 
        externalSystem.applyChange(x)
        cacheActor ! Sync(x)
    }
  }
}

Aber ich habe jetzt zwei Anforderungen:

  1. Die CacheActor verfügt über einen internen Zustand und im Idealfall würde ich es gerne seine Sync Befehle verarbeiten sequentiell
  2. Wenn ich mit der CacheActor Posteingang enthält zwei Sync(x) Anweisungen für den gleichen Wert von x am Ende, dann würde Ich mag die zweite ignorieren (dh sollte ich habe nur eine anhängige Sync Anweisung für einen bestimmten Wert von x)

Gibt es eine Möglichkeit, einen Schauspieler zu zwingen, single-threaded zu sein? Gibt es eine Möglichkeit, die Schauspieler Postfach zugreifen können, und entfernen Sie alle doppelten Ereignisse? Kann ich die CacheActor wie, um nicht vermeiden Implementierung nicht Schauspieler

War es hilfreich?

Lösung

Ein Schauspieler ist garantiert nur zu einem Zeitpunkt auf einem Thread ausführen, und die Nachrichten in der Mailbox des Schauspielers sind in FIFO-Reihenfolge, so # 1 ist.

2 ist schwieriger, da es keine integrierte Unterstützung für sie ist. Es gibt ein Attribut auf dem Schauspieler namens „Mailbox“. Sie können die Mailbox direkt zugreifen, anstatt durch empfangen oder zu reagieren. Alles, was Sie tun müssen, ist die passende Sync-Nachrichten aus der Mailbox ziehen aufrufen, bevor Sie die Nachricht fertig sind, verarbeitet werden. Wenn dies zu tun, müssen Sie auf dem Schauspieler synchronisieren, um zu einem anderen Thread zu verhindern versuchen, das Add Zeug auf die Mailbox während einer Nachricht senden.

Es sollte auf dem Schauspieler zu synchronisieren zu beachten, die Deadlock Freiheit Garantien von der Bibliothek eliminiert, und die Skalierbarkeit reduzieren. Aber aus praktischer Sicht werden Sie wahrscheinlich in Ordnung sein.

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