Akka Kill vs. Stop vs. Poison Pill?


212

Neuling Frage von Akka - Ich lese über Akka Essentials, könnte jemand bitte den Unterschied zwischen Akka Stop / Poison Pill vs. Kill erklären? Das Buch bietet nur eine kleine Erklärung: "Töten ist synchron vs. Giftpille ist asynchron." Aber wie? Wird der Thread des aufrufenden Akteurs während dieser Zeit gesperrt? Werden die Kinderdarsteller während des Tötens, der Beschwörung nach dem Stopp usw. benachrichtigt? Beispielanwendungen eines Konzepts im Vergleich zum anderen?

Danke vielmals!


12
rs_atl hat es sehr gut beantwortet, lassen Sie mich nur hinzufügen, dass nichts an Schauspielern synchron ist, nicht einmal context.stop (self).
Roland Kuhn

1
@ RolandKuhn was ist mit context.become?
Ionuț G. Stan

3
context.becomebezeichnet das Verhalten, das auf die nächste Nachricht angewendet werden soll. Dies bedeutet, dass es wirksam wird, nachdem die aktuelle Nachricht verarbeitet wurde. in dieser Hinsicht ist es ziemlich ähnlich context.stop(self).
Roland Kuhn

Antworten:


328

Beides stopund PoisonPillbeendet den Akteur und stoppt die Nachrichtenwarteschlange. Sie veranlassen den Akteur, die Verarbeitung von Nachrichten einzustellen, einen Stoppanruf an alle untergeordneten Elemente zu senden, auf deren Beendigung zu warten und dann seinen postStopHook aufzurufen . Alle weiteren Nachrichten werden an die Mailbox für tote Briefe gesendet.

Der Unterschied besteht darin, welche Nachrichten verarbeitet werden, bevor diese Sequenz beginnt. Im Falle des stopAnrufs wird die aktuell verarbeitete Nachricht zuerst abgeschlossen, alle anderen werden verworfen. Beim Senden von a PoisonPillist dies einfach eine weitere Nachricht in der Warteschlange, sodass die Sequenz beginnt, wenn die PoisonPillempfangen wird. Alle Nachrichten, die in der Warteschlange davor stehen, werden zuerst verarbeitet.

Im Gegensatz dazu veranlasst die KillNachricht den Akteur, einen zu werfen, ActorKilledExceptionder unter Verwendung des normalen Supervisor-Mechanismus behandelt wird. Das Verhalten hier hängt also davon ab, was Sie in Ihrer Supervisor-Strategie definiert haben. Standardmäßig wird der Schauspieler gestoppt. Das Postfach bleibt jedoch bestehen. Wenn der Akteur neu gestartet wird, werden weiterhin die alten Nachrichten angezeigt, mit Ausnahme derjenigen, die den Fehler verursacht hat.

Siehe auch den Abschnitt "Stoppen eines Schauspielers", "Töten eines Schauspielers" in den Dokumenten:

http://doc.akka.io/docs/akka/snapshot/scala/actors.html

Und mehr zu Überwachungsstrategien:

http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html


4
ausgezeichnete Antwort danke, sollte auf dem Akka-Tutorial veröffentlicht werden!
LaloInDublin

16
Die Kill-Nachricht führt NICHT dazu, dass der Akteur mit dem normalen Supervisor-Mechanismus neu gestartet wird, es sei denn, Sie verwenden eine nicht standardmäßige Supervisor-Strategie, da ActorKilledException in Stop und nicht in Restart aufgelöst wird.
Lisak

Eigentlich ist es ziemlich ärgerlich, weil die einzige eingebaute Möglichkeit, Schauspieler neu zu starten, darin besteht, eine Ausnahme auszulösen.
Lisak

Oder senden Sie eine PoisonPill von einem betreuenden Akteur an diejenige, die neu gestartet werden soll, und starten Sie sie erneut.
Lisak

Gibt es einen Unterschied bei der Verwendung context.stop(self)?
BAR

1

Verwenden Sie PoisonPill, wann immer Sie können. Es wird in die Mailbox gestellt und wie jede andere Nachricht konsumiert. Sie können "context.stop (self)" auch innerhalb eines Schauspielers verwenden.


0

PoisonPill stoppt den Akteur asynchron, nachdem alle Nachrichten, die vor PoisonPill in der Mailbox empfangen wurden, fertig sind.


20
Nein, Kill hat keine besondere Priorität, genau wie PoisonPill
Roland Kuhn

0

Sie können sowohl Schauspielerstopp als auch Giftpille verwenden, um die Verarbeitung von Schauspielern zu stoppen, und töten, um den Schauspieler in seiner Gesamtheit zu beenden. x.stop ist ein Aufruf, den Sie in der akka-Empfangsmethode tätigen. Er ersetzt den Akteurstatus erst nach dem Aufruf von postStop durch einen neuen Akteur. x! PoisonPill ist eine Methode, die Sie an den Akteur übergeben, um die Verarbeitung zu stoppen, wenn der Akteur ausgeführt wird (empfohlen). ersetzt auch den Akteurstatus nach dem Aufruf von postStop. x.kill beendet den Schauspieler und entfernt den Schauspieler im Schauspielerpfad und ersetzt den gesamten Schauspieler durch einen neuen Schauspieler.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.