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

212

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

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

LaloInDublin
источник
12
rs_atl ответил очень хорошо, позвольте мне добавить, что ничего об актерах не является синхронным, даже context.stop (self).
Роланд Кун
1
@RolandKuhn как насчет context.become?
Ionuț G. Stan
3
context.becomeобозначает поведение, которое будет применено к следующему сообщению, что означает, что оно вступает в силу после обработки текущего сообщения; в связи с этим это довольно похоже context.stop(self).
Роланд Кун

Ответы:

328

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

Разница в том, какие сообщения обрабатываются до начала этой последовательности. В случае 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

rs_atl
источник
4
отличный ответ спасибо, должен быть размещен на учебнике Акка!
LaloInDublin
16
Сообщение Kill НЕ приводит к перезапуску субъекта с использованием обычного механизма супервизора, если вы не используете стратегию супервизора не по умолчанию, потому что ActorKilledException разрешает Stop, а не Restart.
Лисак
На самом деле это довольно раздражает, потому что единственный встроенный способ перезапуска актеров - это исключение.
Лисак
Или отправьте PoisonPill от надзирающего актера тому, которого нужно перезапустить и запустить снова.
Лисак
Есть ли разница при использовании context.stop(self)?
BAR
1

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

JohnUK
источник
0

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

idonnie
источник
20
нет, убийство не имеет особого значения, так же , как PoisonPill
Roland Куна
0

Вы можете использовать как остановку актера, так и таблетку отравления, чтобы остановить обработку акторов, и убить, чтобы полностью прекратить действия актера. x.stop - это вызов, который вы делаете в методе получения akka, только заменит состояние актера новым актором после вызова postStop. Икс ! PoisonPill - это метод, который вы передаете актеру, чтобы остановить обработку, когда он работает (рекомендуется). также заменит состояние актера после вызова postStop. x.kill прекратит действие актера и удалит его из пути актера и заменит весь актер новым актером.

Джая Чандра С Редди
источник