Diễn viên hoạt động như thế nào so với chủ đề?


88

Có lời giải thích nào hay và ngắn gọn về cách hoạt động của Diễn viên so với chủ đề không?

Một chuỗi không thể được xem như một tác nhân và gửi tin nhắn đến các chuỗi khác? Tôi thấy một số khác biệt, nhưng nó không rõ ràng đối với tôi. Tôi có thể sử dụng Diễn viên ở bất kỳ ngôn ngữ nào bằng cách sử dụng các chủ đề khác nhau không?

Câu trả lời:


78

Mô hình diễn viên hoạt động dựa trên việc truyền thông điệp. Các tiến trình riêng lẻ (tác nhân) được phép gửi thông điệp không đồng bộ cho nhau. Điều phân biệt điều này với những gì chúng ta thường nghĩ về mô hình luồng, là không có (ít nhất là trên lý thuyết) không có trạng thái chia sẻ. Và nếu ai đó tin rằng (tôi nghĩ một cách chính đáng) dòng trạng thái chia sẻ đó là căn nguyên của mọi điều xấu xa, thì người mẫu diễn viên sẽ trở nên rất hấp dẫn.

Tuy nhiên, chúng ta không nên quá phấn khích. Người mẫu diễn viên không (trái với một số cáo buộc) khiến nó không thể có những bế tắc. Mô hình tác nhân cũng không ngăn bạn tranh giành tài nguyên giữa các quy trình khác nhau - ví dụ: hàng đợi thông báo. Mô hình chỉ "không khóa" trên một mức nhất định. Ở cấp độ thấp hơn, để điều phối hàng đợi tin nhắn, vẫn cần phải khóa.

Một chuỗi không thể được xem như một tác nhân và gửi tin nhắn đến các chuỗi khác?

Vâng, có và không. Không, nếu bạn chỉ sử dụng phương pháp đặt mutexes xung quanh các vị trí bộ nhớ được chia sẻ. Sau đó, các luồng chia sẻ trạng thái này - cả hai đều có quyền truy cập vào bộ nhớ này, cả hai đều có thể đọc nó, ghi lại nó, v.v. Nhưng bạn có thể xây dựng một mô hình tác nhân trên đầu một mô hình luồng và thực sự tất cả việc triển khai tác nhân đều có luồng bên dưới. Tôi đã hack cùng nhau một cái gì đó như thế này (rất tệ) bằng cách cho mỗi luồng một hàng đợi được bảo vệ bởi mutex - chỉ cho vui. Để có ý tưởng về cách quản lý trở kháng luồng tác nhân, hãy xem câu hỏi của tôi từ một năm trước .

Tôi có thể sử dụng Mô hình diễn viên bằng bất kỳ ngôn ngữ nào bằng cách sử dụng các luồng khác nhau không?

Có, nhưng sẽ mất công hơn một chút. Ngôn ngữ yêu thích của bạn cũng có thể có một thư viện chuyển thư, vì vậy đó sẽ là điều đầu tiên cần điều tra. Ngoài ra, bạn nên điều tra việc sử dụng cấu trúc dữ liệu bất biến. Lưu ý rằng nếu cấu trúc dữ liệu là bất biến, thì về cơ bản bạn đã xử lý vấn đề "trạng thái chia sẻ" - nhiều luồng có thể giữ các tham chiếu đến dữ liệu bất biến mà không có bất kỳ điều gì xấu xảy ra. Có một lý do tại sao ngôn ngữ diễn viên cũng có xu hướng là ngôn ngữ chức năng (erlang, scala).

Bạn cũng có thể muốn xem Bộ nhớ Giao dịch Phần mềm, đây là một mô hình khác nhưng cũng hấp dẫn. Clojure là ví dụ yêu thích của tôi về điều đó.


3
Tôi càng sử dụng các mô hình đồng thời dựa trên thông điệp không đồng bộ (ví dụ như các tác nhân hoặc async / await), tôi càng nghĩ rằng chúng chỉ là kép của mô hình đồng thời chặn đồng bộ tiêu chuẩn cũ. Truyền thông điệp không đồng bộ thực sự không dễ dàng hay khó hơn bất kỳ việc sử dụng khóa và màn hình nào. Thật vậy, không có trạng thái có thể thay đổi được chia sẻ, mà chỉ ở cấp tác nhân duy nhất . Nhưng một tác nhân vẫn có trạng thái có thể thay đổi, và nó thực sự có thể quan sát được bởi tất cả các tác nhân hợp tác với nó. Vì vậy, bạn có thể có tất cả những vấn đề giống nhau: bế tắc, livelocks, đói, điều kiện chủng tộc vv
Piotr Kołaczkowski

2

Tôi sẽ không nói rằng các diễn viên luôn chuyển các thông điệp một cách không đồng bộ - điều đó sẽ quá chậm. Trong trường hợp cụ thể, dự án JActor sử dụng các thông báo 2 chiều (yêu cầu / phản hồi) để mô hình hóa một cuộc gọi phương thức tốt hơn. Và hầu hết các yêu cầu đều được phục vụ đồng bộ.

JActor (một thư viện Java) cũng không sử dụng khóa. Chỉ một số cấu trúc dữ liệu nguyên tử và đồng thời, với một vài semaphores được đưa vào. Việc truyền thông điệp là khoảng 0,8 tỷ thông báo mỗi giây.

https://github.com/laforge49/JActor


2
Mô hình tác nhân được xác định bằng cách chỉ sử dụng giao tiếp không đồng bộ ( en.wikipedia.org/wiki/Actor_model ). Nếu JActor không làm điều đó, thì đó không phải 100% chỉ là người mẫu diễn viên. Nó có thể đơn giản sử dụng mô hình diễn viên như một trong nhiều tính năng của nó.
BT
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.