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!


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


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.


0

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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.