Scala Schauspieler als Single-Threaded-Warteschlangen
-
05-07-2019 - |
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:
-
ChangeApplicationActor
-
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:
- Die
CacheActor
verfügt über einen internen Zustand und im Idealfall würde ich es gerne seineSync
Befehle verarbeiten sequentiell - Wenn ich mit der
CacheActor
Posteingang enthält zweiSync(x)
Anweisungen für den gleichen Wert vonx
am Ende, dann würde Ich mag die zweite ignorieren (dh sollte ich habe nur eine anhängigeSync
Anweisung für einen bestimmten Wert vonx
)
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
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.