Akka Kill vs Stop vs Poison Pill?


213

Domanda per principianti di Akka - Sto leggendo Akka Essentials, qualcuno potrebbe spiegare la differenza tra Akka Stop / Poison Pill vs Kill? Il libro offre solo una piccola spiegazione "Kill is synchronous vs. Poison pill is asynchronous". Ma in che modo? Il thread dell'attore chiamante si blocca durante questo periodo? I bambini attori vengono avvisati durante l'uccisione, l'invocazione post-stop, ecc.? Esempi di usi di un concetto rispetto all'altro?

Grazie molto!


12
rs_atl ha risposto molto bene, lasciatemi aggiungere che nulla degli attori è sincrono, nemmeno context.stop (self).
Roland Kuhn

1
@RolandKuhn di cosa context.become?
Ionuț G. Stan

3
context.becomedesigna il comportamento da applicare al messaggio successivo, il che significa che ha effetto dopo che il messaggio corrente è stato elaborato; a questo proposito è abbastanza simile context.stop(self).
Roland Kuhn

Risposte:


331

Entrambi stope PoisonPilltermineranno l'attore e interromperanno la coda dei messaggi. Faranno sì che l'attore interrompa l'elaborazione dei messaggi, invierà una chiamata di arresto a tutti i suoi figli, attenderà che terminino, quindi chiamerà il suo postStophook. Tutti gli altri messaggi vengono inviati alla casella delle lettere morte.

La differenza è in quali messaggi vengono elaborati prima dell'inizio di questa sequenza. Nel caso della stopchiamata, il messaggio attualmente in fase di elaborazione viene completato per primo e tutti gli altri vengono scartati. Quando si invia un PoisonPill, questo è semplicemente un altro messaggio in coda, quindi la sequenza inizierà quando PoisonPillverrà ricevuto. Tutti i messaggi che sono in coda nella coda verranno elaborati per primi.

Al contrario, il Killmessaggio fa sì che l'attore lanci un fileActorKilledException che viene gestito utilizzando il normale meccanismo del supervisore. Quindi il comportamento qui dipende da ciò che hai definito nella tua strategia di supervisore. L'impostazione predefinita è fermare l'attore. Ma la casella di posta persiste, quindi quando l'attore si riavvia avrà ancora i vecchi messaggi tranne quello che ha causato l'errore.

Vedi anche la sezione "Fermare un attore", "Uccidere un attore" nei documenti:

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

E altro sulle strategie di supervisione:

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


4
ottima risposta grazie, dovrebbe essere pubblicato sul tutorial Akka!
LaloInDublin

16
Il messaggio Kill NON causa il riavvio dell'attore utilizzando il normale meccanismo del supervisore a meno che non si utilizzi una strategia del supervisore non predefinita perché ActorKilledException si risolve in Stop, non in Restart.
lisak

In realtà è abbastanza fastidioso perché l'unico modo integrato per riavviare gli attori è lanciare un'eccezione.
lisak

Oppure inviare una PoisonPill da un attore supervisore a quello che dovrebbe essere riavviato e ricominciare.
lisak

C'è qualche differenza se si utilizza context.stop(self)?
BAR

1

Usa PoisonPill ogni volta che puoi. Viene inserito nella casella di posta e viene consumato come qualsiasi altro messaggio. Puoi anche usare "context.stop (self)" dall'interno di un attore.


0

PoisonPill arresta in modo asincrono l'attore dopo aver terminato con tutti i messaggi ricevuti nella casella di posta, prima di PoisonPill.


20
no, Kill non ha alcuna priorità speciale, proprio come PoisonPill
Roland Kuhn

0

Puoi usare sia l'arresto dell'attore che la pillola del veleno per interrompere l'elaborazione degli attori e uccidere per terminare l'attore nella sua interezza. x.stop è una chiamata che fai nel metodo akka receive, sostituirà solo lo stato dell'attore con un nuovo attore dopo aver chiamato postStop. X ! PoisonPill è un metodo che si passa all'attore per interrompere l'elaborazione quando l'attore è in esecuzione (consigliato). sostituirà anche lo stato dell'attore dopo aver chiamato postStop. x.kill terminerà l'attore e rimuoverà l'attore nel percorso dell'attore e sostituirà l'intero attore con un nuovo attore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.