Pergunta sobre a Akka para iniciantes - Estou lendo o Akka Essentials, alguém poderia explicar a diferença entre Akka Stop / Poison Pill x Kill? O livro oferece apenas uma pequena explicação: "Matar é síncrono vs. Pílula de veneno é assíncrono". Mas de que maneira? O encadeamento do ator que está chamando é bloqueado durante esse período? Os atores infantis são notificados durante a matança, invocados após a parada, etc.? Exemplos de usos de um conceito versus outro?
Muito Obrigado!
context.become
?context.become
designa o comportamento a ser aplicado à próxima mensagem, o que significa que entra em vigor após o processamento da mensagem atual; nesse sentido, é bem parecidocontext.stop(self)
.Respostas:
Ambos
stop
ePoisonPill
encerrará o ator e interromperá a fila de mensagens. Eles farão com que o ator pare de processar mensagens, envie uma chamada de parada para todos os seus filhos, espere que eles terminem e depois ligue para opostStop
gancho. Todas as outras mensagens são enviadas para a caixa de correio de mensagens não entregues.A diferença está em que as mensagens são processadas antes do início dessa sequência. No caso da
stop
chamada, a mensagem atualmente sendo processada é concluída primeiro, com todas as outras descartadas. Ao enviar umPoisonPill
, essa é simplesmente outra mensagem na fila; portanto, a sequência será iniciada quando a mensagemPoisonPill
for recebida. Todas as mensagens que estão à frente na fila serão processadas primeiro.Por outro lado, a
Kill
mensagem faz com que o ator lance umActorKilledException
que seja tratado usando o mecanismo normal do supervisor. Portanto, o comportamento aqui depende do que você definiu na sua estratégia de supervisor. O padrão é parar o ator. Mas a caixa de correio persiste; portanto, quando o ator reiniciar, ainda haverá as mensagens antigas, exceto a que causou a falha.Consulte também a seção 'Parando um ator', 'Matando um ator' nos documentos:
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
E mais sobre estratégias de supervisão:
http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html
fonte
context.stop(self)
?Use PoisonPill sempre que puder. Ele é colocado na caixa de correio e é consumido como qualquer outra mensagem. Você também pode usar "context.stop (self)" de dentro de um ator.
fonte
O PoisonPill interrompe de forma assíncrona o ator após concluir todas as mensagens recebidas na caixa de correio, antes do PoisonPill.
fonte
Você pode usar a parada do ator e a pílula venenosa para interromper o processamento dos atores e matar para encerrar o ator por inteiro. x.stop é uma chamada que você faz no método akka receive, substituirá apenas o estado do ator pelo novo ator depois de chamar postStop. x! PoisonPill é um método que você transmite ao ator para interromper o processamento quando o ator está em execução (recomendado). também substituirá o estado do ator depois de chamar postStop. x.kill encerrará o ator e removerá o ator no caminho do ator e substituirá o ator inteiro por um novo ator.
fonte