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!
context.become
?context.become
menetapkan perilaku yang akan diterapkan pada pesan berikutnya, yang artinya akan berlaku setelah pesan saat ini diproses; dalam hal ini cukup seperticontext.stop(self)
.Jawaban:
Keduanya
stop
danPoisonPill
akan 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
stop
panggilan, pesan yang sedang diproses diselesaikan terlebih dahulu, dan semua yang lain dibuang. Saat mengirimPoisonPill
, ini hanyalah pesan lain dalam antrian, jadi urutannya akan dimulai ketikaPoisonPill
diterima. Semua pesan yang ada di depannya dalam antrian akan diproses terlebih dahulu.Sebaliknya,
Kill
pesan 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
sumber
context.stop(self)
?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.
sumber
PoisonPill secara asinkron menghentikan aktor setelah selesai dengan semua pesan yang diterima ke dalam kotak surat, sebelum PoisonPill.
sumber
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.
sumber