Акка Килл против Стоп против Яда Таблетки?

193

Вопрос с новичком в Акке - я читаю Akka Essentials, может кто-нибудь объяснить разницу между Akka Stop/Poison Pill vs. Kill? Книга предлагает лишь небольшое объяснение: "Убить синхронно против ядовитой таблетки асинхронно". Но каким образом? Заблокирован ли поток вызывающего актера в течение этого времени? Представлены ли дочерние субъекты во время убийства, после остановки и т.д.? Пример использования одного понятия в сравнении с другим?

Большое спасибо!

  • 12
    rs_atl ответил очень хорошо, позвольте мне добавить, что ничего об актерах не является синхронным, даже context.stop (self).
  • 1
    @RolandKuhn как насчет context.become ?
Показать ещё 1 комментарий
Теги:
akka

3 ответа

287
Лучший ответ

Оба stop и PoisonPill завершат действие актера и остановят очередь сообщений. Они заставят актера прекратить обработку сообщений, отправить стоп-вызов всем его детям, дождаться их завершения, а затем вызвать его postStop hook. Все дальнейшие сообщения отправляются в почтовый ящик мертвых букв.

Разница в том, какие сообщения обрабатываются до начала этой последовательности. В случае вызова stop сначала обрабатывается сообщение, которое обрабатывается, а все остальные отбрасываются. При отправке PoisonPill это просто еще одно сообщение в очереди, поэтому последовательность запускается при приеме PoisonPill. Все сообщения, которые впереди в очереди, будут обработаны первыми.

В противоположность этому сообщение Kill заставляет актера бросать ActorKilledException, который обрабатывается с использованием обычного механизма супервизора. Поэтому поведение здесь зависит от того, что вы определили в своей стратегии супервизора. Значение по умолчанию - остановить актера. Но почтовый ящик сохраняется, поэтому, когда актер перезагружается, он все равно будет иметь старые сообщения, кроме тех, которые вызвали сбой.

Также см. раздел "Остановка актера", раздел "Убийство актера" в документах:

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

И больше о стратегиях надзора:

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

  • 4
    отличный ответ спасибо, должен быть размещен на учебнике Акка!
  • 14
    Сообщение Kill НЕ приводит к перезапуску субъекта с использованием обычного механизма супервизора, если только вы не используете стратегию супервизора не по умолчанию, поскольку ActorKilledException разрешает Stop, а не Restart.
Показать ещё 6 комментариев
1

Используйте PoisonPill, когда можете. Он помещается в почтовый ящик и потребляется как любое другое сообщение. Вы также можете использовать "context.stop(self)" изнутри актера.

0

PoisonPill асинхронно останавливает актера после его завершения со всеми сообщениями, которые были получены в почтовый ящик, до PoisonPill.

  • 19
    нет, Kill не имеет особого приоритета, как и PoisonPill

Ещё вопросы

Сообщество Overcoder
Наверх
Меню