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 đó.