2012-12-12 19 views
189

Domanda newbie di Akka - Sto leggendo su 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 as ischronous". Ma in che modo? Blocca thread dell'attore chiamante durante questo periodo? Gli attori bambini sono stati avvisati durante l'uccisione, l'invocazione post-stop, ecc.? Esempi di utilizzo di un concetto rispetto all'altro?Akka Kill vs. Stop vs. Poison Pill?

Grazie mille!

+12

rs_atl ha risposto molto bene, lasciatemi aggiungere che niente degli attori è sincrono, nemmeno context.stop (self). –

+1

@RolandKuhn che dire 'context.become'? –

+3

'context.become' indica il comportamento da applicare al messaggio successivo, il che significa che ha effetto dopo che il messaggio corrente è stato elaborato; a questo proposito è come 'context.stop (self)'. –

risposta

293

Entrambe stop e PoisonPill interromperanno l'attore e interromperanno la coda di messaggi. Faranno in modo che l'attore interrompa l'elaborazione dei messaggi, invii una chiamata di arresto a tutti i suoi figli, attendi che terminino, quindi chiama il suo hook postStop. Tutti gli altri messaggi vengono inviati alla casella di posta delle lettere morte.

La differenza è quando i messaggi vengono elaborati prima dell'inizio di questa sequenza. Nel caso della chiamata stop, il messaggio attualmente in fase di elaborazione viene completato per primo, con tutti gli altri scartati. Quando si invia un PoisonPill, questo è semplicemente un altro messaggio nella coda, quindi la sequenza verrà avviata quando viene ricevuto il numero PoisonPill. Tutti i messaggi che lo precedono nella coda verranno elaborati per primi.

Al contrario, il messaggio Kill fa sì che l'attore lanci uno ActorKilledException che viene gestito utilizzando il normale meccanismo di supervisione. Quindi il comportamento qui dipende da ciò che hai definito nella tua strategia di supervisione. 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.

vedere il 'arresto un attore' Inoltre, 'Uccidere un attore' la sezione nella documentazione:

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

E più sulle strategie di supervisione:

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

+4

risposta eccellente grazie, dovrebbe essere pubblicato sul tutorial Akka! – LaloInDublin

+13

Il messaggio Kill NON causa il riavvio dell'attore utilizzando il normale meccanismo di supervisione a meno che non si utilizzi una strategia di supervisione non predefinita perché ActorKilledException si risolve in Stop, non in Riavvia. – lisak

+0

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

-1

PoisonPill si ferma in modo asincrono l'attore dopo averlo terminato con tutti i messaggi ricevuti nella cassetta postale, prima di PoisonPill.

+16

no, Kill non ha alcuna priorità speciale, proprio come PoisonPill –

0

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

Problemi correlati