2012-01-24 34 views
17

Như tôi đã hiểu, các tác nhân về cơ bản là các chuỗi nhẹ được thực hiện trên các luồng, chạy nhiều tác nhân trên một nhóm nhỏ các chuỗi được chia sẻ.scala actors vs thread và chặn IO

Với trường hợp đó, việc sử dụng các hoạt động chặn trong một diễn viên sẽ chặn luồng cơ bản. Đây không phải là vấn đề chính xác bởi vì thư viện diễn viên sẽ sinh ra nhiều chủ đề hơn khi cần thiết (đúng không?) Nhưng sau đó bạn kết thúc với rất nhiều và nhiều luồng, phủ nhận lợi ích của việc sử dụng các diễn viên ngay từ đầu.

Cho rằng, các diễn viên hoạt động như thế nào khi bạn cần thực hiện các hoạt động IO như vậy? Có các hoạt động mà "diễn viên chặn", đình chỉ diễn viên trong khi cho phép các chủ đề đi vào các hoạt động khác (giống như các hoạt động chặn treo chuỗi trong khi cho phép CPU tiếp tục hoạt động khác), hoặc là tất cả mọi thứ được viết trong CPS, diễn viên? Hay các diễn viên đơn giản là không phù hợp với loại hoạt động dài hạn này?

Bối cảnh: Tôi có kinh nghiệm viết các công cụ đa luồng theo cách cổ điển và hiểu rõ cách các vòng lặp CPS/sự kiện hoạt động, nhưng hoàn toàn không có kinh nghiệm làm việc với diễn viên, và chỉ muốn hiểu , trước khi tôi đi sâu vào mã.

+1

Nó nên liên quan đến một số điểm tiếp tục được giới hạn, như trong http://jim-mcbeath.blogspot.com/2010/09/scala-coroutines.html. Hoặc có thể sử dụng luồng thông điệp không chặn? (http://blog.typesafe.com/non-blocking-message-flow-with-akka-actors) – VonC

+0

Vui lòng xem câu trả lời của tôi ở đây http://stackoverflow.com/questions/1512066/is-there-any-non -blocking-io-open-source-implementation-cho-scalas-diễn viên –

Trả lời

2

Đây không phải là một vấn đề đúng đắn vì các thư viện diễn viên sẽ đẻ trứng đề hơn khi cần thiết (không biết có đúng?)

Cho đến nay như tôi hiểu, đó không phải là đúng. Diễn viên bị chặn và gửi một thư khác đến thư đó khiến thư đó nằm trong hộp thư diễn viên cho đến khi diễn viên đó có thể receive hoặc react vào thư.

Trong lập trình trong Scala (1), nó nêu rõ rằng các tác nhân không được chặn. Nếu một diễn viên cần phải làm một cái gì đó dài chạy nó sẽ vượt qua công việc cho một diễn viên thứ hai, để các diễn viên chính có thể tự giải phóng và đi đọc thêm tin nhắn từ hộp thư của nó. Một khi công nhân đã hoàn thành công việc, nó có thể báo hiệu sự kiện đó trở lại với diễn viên chính, có thể hoàn thành bất cứ điều gì nó phải làm.

Vì công nhân cũng có hộp thư, bạn sẽ kết thúc với một số công nhân bận rộn làm việc theo cách của họ thông qua công việc. Nếu bạn không có đủ CPU để xử lý, hàng đợi của họ sẽ ngày càng lớn hơn. Cuối cùng, bạn có thể mở rộng quy mô bằng cách sử dụng các diễn viên từ xa. Akka có thể hữu ích hơn trong các trường hợp như vậy.

(1) Chương 32.5 của Lập trình trong Scala (Odersky, tái bản lần thứ hai, 2010)

EDIT: Tôi thấy điều này:

Phương pháp lên lịch của đặc điểm nam diễn viên có thể được ghi đè để trả lại một ResizableThreadPoolScheduler, mà thay đổi kích thước hồ bơi thread của nó để tránh nạn đói gây ra bởi các diễn viên gọi các phương thức chặn tùy ý.

Tìm thấy nó tại địa chỉ: http://www.scala-lang.org/api/current/scala/actors/Actor.html

Vì vậy, có nghĩa là tùy thuộc vào lịch trình impl bạn thiết lập, có lẽ là hồ bơi sử dụng để chạy các diễn viên sẽ được tăng lên. Tôi đã sai khi tôi nói bạn đã sai :-) Phần còn lại của câu trả lời vẫn đúng.

1

Cách hoạt động của công việc trong erlang là tất cả hoạt động chặn phải được gửi bằng tin nhắn gửi bởi vì khi diễn viên của bạn bị chặn đang chờ tin nhắn, nó sẽ tạo luồng cho tác nhân khác.

Vì vậy, nếu bạn muốn thực hiện một số thao tác chặn như đọc từ một tệp, bạn nên làm một diễn viên FileReader sử dụng api không bloking để đọc và ghi từ tệp. Và có diễn viên khác của bạn sử dụng diễn viên này (gửi và nhận tin nhắn cho nó) như là một api để đọc và ghi vào tập tin.

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