Akka Kill vs Stop vs Poison Pill?


212

Akka'nın acemi sorusu - Akka Essentials'ı okuyorum, birisi Akka Stop / Poison Pill vs. Kill arasındaki farkı açıklayabilir mi? Kitap "Öldür eşzamanlı mı, Zehirli hap eşzamansız mı?" Ama ne şekilde? Arayan aktör dizisi bu süre boyunca kilitleniyor mu? Çocuk aktörler öldürme, durma sonrası çekilme vb. Sırasında bilgilendirilir mi? Bir kavramın diğerine karşı örnek kullanımları?

Çok teşekkürler!


12
rs_atl çok iyi cevap verdi, sadece aktörler hakkında hiçbir şeyin eşzamanlı olmadığını eklememe izin verin, context.stop (self) bile değil.
Roland Kuhn

1
@RolandKuhn ne olacak context.become?
Ionuț G. Stan

3
context.becomebir sonraki mesaja uygulanacak davranışı belirtir, yani mevcut mesaj işlendikten sonra geçerlilik kazanır; bu bakımdan oldukça benzer context.stop(self).
Roland Kuhn

Yanıtlar:


328

Her ikisi de stopve PoisonPillaktörü sonlandıracak ve ileti sırasını durduracaktır. Aktörün mesajları işlemeyi durdurmasına, tüm çocuklarına bir durdurma çağrısı göndermesine, sonlanmalarını beklemesine ve ardından çağrısını çağrmasına neden olurlar postStop. Diğer tüm mesajlar ölü mektuplar posta kutusuna gönderilir.

Fark, bu sekans başlamadan önce mesajların işlenmesidir. stopÇağrı durumunda, o anda işlenmekte olan mesaj ilk önce tamamlanır, diğer tüm mesajlar atılır. Bir gönderirken PoisonPill, bu sadece kuyruktaki başka bir mesajdır, bu nedenle sıra PoisonPillalındığında başlar. Sırada bekleyen tüm iletiler ilk önce işlenir.

Bunun aksine, Killmesaj aktörün ActorKilledExceptionnormal denetleyici mekanizması kullanılarak ele alınan bir fırlatmasına neden olur . Dolayısıyla, buradaki davranış, yönetici stratejinizde tanımladığınıza bağlıdır. Varsayılan, aktörü durdurmaktır. Ancak posta kutusu devam eder, bu nedenle aktör yeniden başlatıldığında hataya neden olanın dışındaki eski iletilere sahip olur.

Ayrıca dokümanlardaki 'Aktörü Durdurma', 'Aktörü Öldürme' bölümüne bakın:

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

Denetim stratejileri hakkında daha fazlası:

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


4
mükemmel cevap teşekkür ederim, Akka öğretici yayınlanmalıdır!
LaloInDublin

16
Öldür iletisi, ActorKilledException Yeniden Başlatmak yerine Durdurma'ya çözümlendiğinden, varsayılan olmayan denetleyici stratejisi kullanmadığınız sürece aktörün normal denetleyici mekanizmasını kullanarak yeniden başlatılmasına neden OLMAZ.
lisak

Aslında oldukça sinir bozucu çünkü aktörleri yeniden başlatmanın tek yerleşik yolu bir İstisna atmak.
lisak

Ya da denetleyici bir aktörden yeniden başlatılması gereken bir PoisonPill göndermek ve tekrar başlatmak.
lisak

Kullanırken herhangi bir fark var mı context.stop(self)?
BAR

1

Mümkün olduğunca PoisonPill kullanın. Posta kutusuna konur ve diğer mesajlar gibi tüketilir. Bir aktörün içinden "context.stop (self)" öğesini de kullanabilirsiniz.


0

PoisonPill, PoisonPill'den önce posta kutusuna alınan tüm iletilerle bittikten sonra aktörü zaman uyumsuz olarak durdurur.


20
Hayır, Kill'in özel bir önceliği yoktur, tıpkı PoisonPill gibi
Roland Kuhn

0

Aktörlerin işlenmesini durdurmak için hem aktör durdurma hem de zehir hapını kullanabilir ve aktörü tamamen sona erdirmek için öldürebilirsiniz. x.stop, akka alma yönteminde yaptığınız bir çağrıdır, yalnızca postStop'u çağırdıktan sonra aktör durumunu yeni aktörle değiştirecektir. x! PoisonPill, aktör çalışırken işlemeyi durdurmak için aktöre ilettiğiniz bir yöntemdir (Önerilen). postStop çağrıldıktan sonra oyuncu durumunun da yerini alacaktır. x.kill aktörü sonlandıracak ve aktör Yolu'ndaki aktörü kaldıracak ve tüm aktörü yeni bir aktörle değiştirecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.