Pregunta de novato sobre Akka: estoy leyendo sobre Akka Essentials, ¿alguien podría explicar la diferencia entre Akka Stop / Poison Pill vs. Kill? El libro ofrece solo una pequeña explicación: "La muerte es sincrónica frente a la píldora venenosa es asincrónica". ¿Pero de qué manera? ¿El hilo del actor llamante se bloquea durante este tiempo? ¿Se les notifica a los niños actores durante la muerte, después de la detención envuelto, etc. Ejemplos de usos de un concepto versus el otro?
¡Muchas gracias!
context.become
?context.become
designa el comportamiento que se aplicará al siguiente mensaje, lo que significa que surte efecto después de que se haya procesado el mensaje actual; a este respecto es bastante parecidocontext.stop(self)
.Respuestas:
Ambos
stop
yPoisonPill
finalizarán al actor y detendrán la cola de mensajes. Harán que el actor deje de procesar mensajes, envíe una llamada de detención a todos sus hijos, espere a que terminen y luego llame a supostStop
enlace. Todos los mensajes adicionales se envían al buzón de letras muertas.La diferencia está en qué mensajes se procesan antes de que comience esta secuencia. En el caso de la
stop
llamada, el mensaje que se está procesando actualmente se completa primero, con todos los demás descartados. Al enviar unPoisonPill
, este es simplemente otro mensaje en la cola, por lo que la secuencia comenzará cuandoPoisonPill
se reciba. Todos los mensajes que están por delante en la cola se procesarán primero.Por el contrario, el
Kill
mensaje hace que el actor arroje unoActorKilledException
que se maneja utilizando el mecanismo de supervisión normal. Entonces, el comportamiento aquí depende de lo que haya definido en su estrategia de supervisor. El valor predeterminado es detener al actor. Pero el buzón persiste, por lo que cuando el actor se reinicie, seguirá teniendo los mensajes antiguos, excepto el que causó la falla.Consulte también la sección 'Detener a un actor', 'Matar a un actor' en los documentos:
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
Y más sobre estrategias de supervisión:
http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html
fuente
context.stop(self)
?Usa PoisonPill siempre que puedas. Se coloca en el buzón y se consume como cualquier otro mensaje. También puede usar "context.stop (self)" desde un actor.
fuente
PoisonPill detiene asincrónicamente al actor después de que se haya completado con todos los mensajes que se recibieron en el buzón, antes de PoisonPill.
fuente
Puede usar tanto la píldora de detención como la de veneno para detener el procesamiento de los actores, y matar para terminar con el actor en su totalidad. x.stop es una llamada que realiza en el método de recepción akka, solo reemplazará el estado del actor con el nuevo actor después de llamar a postStop. X ! PoisonPill es un método que pasa al actor para detener el procesamiento cuando el actor se está ejecutando (recomendado). también reemplazará el estado del actor después de llamar a postStop. x.kill terminará el actor y lo eliminará en la ruta del actor y reemplazará a todo el actor con un nuevo actor.
fuente