Akka Kill vs Stop vs Poison Pill?


212

Newbie câu hỏi về Akka - Tôi đang đọc qua Akka Essentials, ai đó có thể vui lòng giải thích sự khác biệt giữa Akka Stop / Poison Pill so với Kill không? Cuốn sách chỉ cung cấp một lời giải thích nhỏ "Kill là đồng bộ so với thuốc độc là không đồng bộ." Nhưng theo cách nào? Liệu các diễn viên gọi chủ đề khóa trong thời gian này? Các diễn viên nhí có được thông báo trong quá trình giết, sau khi ngừng tham gia, v.v.? Ví dụ sử dụng một khái niệm so với khái niệm khác?

Cảm ơn nhiều!


12
rs_atl đã trả lời nó rất tốt, hãy để tôi nói thêm rằng không có gì về diễn viên là đồng bộ, thậm chí không có ngữ cảnh.stop (tự).
Roland Kuhn

1
@RolandKuhn thì context.becomesao?
Ionuț G. Stan

3
context.becomechỉ định hành vi được áp dụng cho tin nhắn tiếp theo, có nghĩa là nó có hiệu lực sau khi tin nhắn hiện tại đã được xử lý; về vấn đề này nó là khá thích context.stop(self).
Roland Kuhn

Câu trả lời:


328

Cả hai stopPoisonPillsẽ chấm dứt diễn viên và dừng hàng đợi tin nhắn. Chúng sẽ khiến diễn viên ngừng xử lý tin nhắn, gửi cuộc gọi dừng cho tất cả các con của nó, đợi chúng chấm dứt, sau đó gọi nópostStop hook . Tất cả các tin nhắn tiếp theo được gửi đến hộp thư thư chết.

Sự khác biệt là trong đó các tin nhắn được xử lý trước khi chuỗi này bắt đầu. Trong trường hợpstop cuộc gọi, tin nhắn hiện đang được xử lý được hoàn thành trước tiên, với tất cả những tin nhắn khác bị loại bỏ. Khi gửi a PoisonPill, đây đơn giản là một tin nhắn khác trong hàng đợi, vì vậy chuỗi sẽ bắt đầu khi PoisonPillnhận được. Tất cả các tin nhắn đi trước nó trong hàng đợi sẽ được xử lý trước.

Ngược lại, Killtin nhắn khiến diễn viên némActorKilledException cái được xử lý bằng cơ chế giám sát bình thường. Vì vậy, hành vi ở đây phụ thuộc vào những gì bạn đã xác định trong chiến lược giám sát của mình. Mặc định là dừng diễn viên. Nhưng hộp thư vẫn tồn tại, vì vậy khi diễn viên khởi động lại, nó vẫn sẽ có các tin nhắn cũ ngoại trừ tin nhắn gây ra lỗi.

Đồng thời xem phần 'Dừng một diễn viên', 'Giết một diễn viên' trong các tài liệu:

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

Và nhiều hơn nữa về các chiến lược giám sát:

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


4
câu trả lời tuyệt vời cảm ơn bạn, nên được đăng trên hướng dẫn Akka!
LaloInDublin

16
Thông báo Kill KHÔNG khiến diễn viên khởi động lại bằng cơ chế giám sát bình thường trừ khi bạn sử dụng chiến lược giám sát không mặc định vì ActorKillsException quyết định dừng, không khởi động lại.
lisak

Trên thực tế, nó khá khó chịu vì cách khởi động lại duy nhất của các diễn viên là ném Exception.
lisak

Hoặc gửi PoisonPill từ một diễn viên giám sát đến người cần được khởi động lại và bắt đầu lại.
lisak

Có sự khác biệt nào nếu sử dụng context.stop(self)?
BAR

1

Sử dụng PoisonPill bất cứ khi nào bạn có thể. Nó được đặt trên hộp thư và được sử dụng như bất kỳ tin nhắn nào khác. Bạn cũng có thể sử dụng "bối cảnh.stop (tự)" từ bên trong một diễn viên.


0

PoisonPill không đồng bộ dừng diễn viên sau khi hoàn thành tất cả các tin nhắn được nhận vào hộp thư, trước PoisonPill.


20
không, Kill không có bất kỳ ưu tiên đặc biệt nào, giống như PoisonPill
Roland Kuhn

0

Bạn có thể sử dụng cả dừng diễn viên và thuốc độc để ngừng xử lý diễn viên và tiêu diệt toàn bộ diễn viên. x.stop là một cuộc gọi bạn thực hiện trong phương thức nhận akka, sẽ chỉ thay thế trạng thái diễn viên bằng diễn viên mới sau khi gọi postStop. x! PoisonPill là một phương thức mà bạn chuyển cho diễn viên để dừng xử lý khi diễn viên đang chạy (Được khuyến nghị). cũng sẽ thay thế trạng thái diễn viên sau khi gọi postStop. x.kill sẽ chấm dứt diễn viên và sẽ loại bỏ diễn viên trong Đường dẫn diễn viên và thay thế toàn bộ diễn viên bằng một diễn viên mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.