2010-08-27 21 views
77

Có giải thích nào tốt và ngắn về cách Diễn viên hoạt động so với chủ đề không?Diễn viên hoạt động như thế nào so với chủ đề?

Không thể xem chủ đề là diễn viên và gửi tin nhắn cho các chủ đề 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ằng bất kỳ ngôn ngữ nào bằng cách sử dụng các chuỗi khác nhau không?

Trả lời

62

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

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

Không thể xem chủ đề là diễn viên và gửi tin nhắn đến các chủ đề khác?

Vâng, có và không. Không, nếu bạn chỉ sử dụng cách tiếp cận đặt các mutexes xung quanh các vị trí bộ nhớ dùng chung. Sau đó, các chủ đề 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 có thể đọc nó, viết lại nó, vv Nhưng bạn có thể xây dựng một mô hình diễn viên trên đầu một mô hình luồng, và thực sự tất cả các diễn viên thực hiện có chủ đề bên dưới. Tôi đã hack với nhau một cái gì đó như thế này (rất nặng) bằng cách cho mỗi thread một hàng đợi bảo vệ bởi một mutex - chỉ để cho vui. Để có được ý tưởng về cách quản lý trở kháng chuỗi tác nhân, hãy xem my question from a year ago.

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 chuỗi khác nhau không?

Có, nhưng sẽ mất nhiều công việc 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 gửi thư, vì vậy đó sẽ là điều đầu tiên để điều tra. Ngoài ra, bạn nên điều tra việc sử dụng các 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ữ 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ó xu hướng cũ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 đó.

+2

Càng sử dụng thông điệp không đồng bộ thông qua mô hình đồng thời dựa (diễn viên ví dụ hoặc async/chờ đợi), tôi càng nghĩ họ chỉ là kép của, tiêu chuẩn đồng bộ mô hình đồng thời ngăn chặn cũ. Việc truyền thông điệp không đồng bộ không thực sự dễ dàng hơn hoặc khó hơn so với việc sử dụng khóa và màn hình.Thật vậy, không có trạng thái có thể thay đổi được chia sẻ, nhưng chỉ ở cấp * tác nhân duy nhất *. Nhưng một diễn viên vẫn có trạng thái có thể thay đổi, và nó thực sự được quan sát bởi tất cả các diễn viên hợp tác với nó. Vì vậy, bạn có thể có tất cả các vấn đề tương tự: deadlocks, livelocks, đói, điều kiện chủng tộc, vv –

2

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

JActor (thư viện Java) cũng không sử dụng khóa. Chỉ có 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 ném vào. Thông điệp đi qua là khoảng 8 tỷ tin nhắn mỗi giây.

https://github.com/laforge49/JActor

+1

Mô hình diễn viên được định nghĩa bởi chỉ sử dụng giao tiếp không đồng bộ (http://en.wikipedia.org/wiki/Actor_model). Nếu JActor không làm điều đó, thì nó không chỉ là 100% mô hình diễn viên. Nó chỉ đơn giản có thể sử dụng mô hình diễn viên như là một trong nhiều tính năng của nó. –

Các vấn đề liên quan