Akka Kill vs Stop vs Poison Pill?

212

Pertanyaan pemula tentang Akka - Saya membaca Akka Essentials, dapatkah seseorang menjelaskan perbedaan antara Pil Stop / Racun Akka vs Bunuh? Buku ini hanya menawarkan sedikit penjelasan, "Bunuh sinkron vs pil beracun asinkron." Tetapi dengan cara apa? Apakah aktor yang memanggil utas mengunci selama ini? Apakah aktor anak-anak diberitahu saat membunuh, pasca-berhenti, dll? Contoh penggunaan satu konsep vs yang lain?

Terimakasih banyak!

LaloInDublin
sumber
12
rs_atl menjawabnya dengan sangat baik, izinkan saya menambahkan bahwa tidak ada apa pun tentang aktor yang sinkron, bahkan context.stop (mandiri).
Roland Kuhn
1
@RandKuhn bagaimana dengan context.become?
Ionuț G. Stan
3
context.becomemenetapkan perilaku yang akan diterapkan pada pesan berikutnya, yang artinya akan berlaku setelah pesan saat ini diproses; dalam hal ini cukup seperti context.stop(self).
Roland Kuhn

Jawaban:

328

Keduanya stopdan PoisonPillakan menghentikan aktor dan menghentikan antrian pesan. Mereka akan menyebabkan aktor berhenti memproses pesan, mengirim panggilan berhenti ke semua anak-anaknya, menunggu mereka untuk mengakhiri, kemudian memanggilpostStop kaitnya. Semua pesan lebih lanjut dikirim ke kotak surat surat mati.

Perbedaannya adalah di mana pesan diproses sebelum urutan ini dimulai. Dalam hal stoppanggilan, pesan yang sedang diproses diselesaikan terlebih dahulu, dan semua yang lain dibuang. Saat mengirim PoisonPill, ini hanyalah pesan lain dalam antrian, jadi urutannya akan dimulai ketika PoisonPillditerima. Semua pesan yang ada di depannya dalam antrian akan diproses terlebih dahulu.

Sebaliknya, Killpesan tersebut menyebabkan aktor melemparActorKilledException yang ditangani menggunakan mekanisme pengawas normal. Jadi perilaku di sini tergantung pada apa yang telah Anda tetapkan dalam strategi penyelia Anda. Standarnya adalah menghentikan aktor. Tetapi kotak surat tetap ada, jadi ketika aktor restart itu masih akan memiliki pesan-pesan lama kecuali yang menyebabkan kegagalan.

Lihat juga bagian 'Menghentikan Aktor', 'Membunuh Aktor' dalam dokumen:

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

Dan lebih lanjut tentang strategi pengawasan:

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

rs_atl
sumber
4
jawaban yang bagus terima kasih, harus diposting pada tutorial Akka!
LaloInDublin
16
Membunuh pesan TIDAK menyebabkan aktor melakukan restart menggunakan mekanisme penyelia normal kecuali jika Anda menggunakan strategi penyelia non-standar karena ActorKilledException memutuskan untuk Berhenti, bukan Me-restart.
lisak
Sebenarnya itu cukup menjengkelkan karena satu-satunya cara untuk memulai kembali para pelaku adalah dengan melemparkan Pengecualian.
lisak
Atau mengirim PoisonPill dari aktor pengawas ke aktor yang harus dimulai ulang dan memulainya lagi.
lisak
Apakah ada perbedaan jika menggunakan context.stop(self)?
BAR
1

Gunakan PoisonPill kapan pun Anda bisa. Itu diletakkan di kotak surat dan dikonsumsi seperti pesan lainnya. Anda juga dapat menggunakan "context.stop (self)" dari dalam aktor.

JohnUK
sumber
0

PoisonPill secara asinkron menghentikan aktor setelah selesai dengan semua pesan yang diterima ke dalam kotak surat, sebelum PoisonPill.

idonnie
sumber
20
tidak, Kill tidak memiliki prioritas khusus, seperti PoisonPill
Roland Kuhn
0

Anda dapat menggunakan penghenti aktor dan pil racun untuk menghentikan pemrosesan aktor, dan membunuh untuk menghentikan aktor secara keseluruhan. x.stop adalah panggilan yang Anda buat dalam metode akka accept, hanya akan mengganti status aktor dengan aktor baru setelah memanggil postStop. x! PoisonPill adalah metode yang Anda berikan kepada aktor untuk berhenti memproses ketika aktor sedang berjalan (Disarankan). juga akan mengganti status aktor setelah memanggil postStop. x.kill akan menghentikan aktor dan akan menghapus aktor di aktor Path dan mengganti seluruh aktor dengan aktor baru.

JayaChandra S Reddy
sumber