2012-03-14 14 views
13

Chỉ mới bắt đầu trên Diễn viên Scala. Các Scala website nói:Scala Diễn viên: nếu phản ứng không bao giờ trả về, tại sao nó cần phải được trong một vòng lặp {}, và tại sao không trong khi (true) làm việc?

hoạt động Chủ đề chặn có thể tránh được bằng cách sử dụng react chờ tin nhắn mới (mặt dây chuyền dựa trên sự kiện của receive). Tuy nhiên, có một mức giá (thường là nhỏ) để thanh toán: react không bao giờ trả lại.

...

Lưu ý rằng việc sử dụng react bên trong một vòng lặp while không hoạt động! Tuy nhiên, vì các vòng lặp phổ biến có hỗ trợ thư viện đặc biệt cho nó ở dạng của một hàm loop. Nó có thể được sử dụng như thế này:

loop { 
    react { 
    case A => ... 
    case B => ... 
    } 
} 

bây giờ tôi đang bối rối - có vẻ là một mâu thuẫn:

a) Nếu react không bao giờ trở lại, sau đó điểm đặt nó trong một vòng lặp là những gì ?

b) Vì loop liên tục thực hiện một khối, nó khác nhau như thế nào với while(true) - tại sao không while hoạt động và cách "không hoạt động" theo cách nào?

Trả lời

11

Cả hai chức năng, loopreact không thuần túy. loop nhận cuộc gọi theo thông số tên và react một PartialFunction, cả hai biến được đặt trên diễn viên thô. Điều này là bởi vì một diễn viên không có một chủ đề kèm theo tất cả các thời gian. Nó sẽ chỉ hoạt động khi có tin nhắn trong hộp thông báo của nó. Đây là lý do tại sao một số while(true) sẽ dẫn đến việc sử dụng CPU 100% và diễn viên không phản hồi.

+0

Vì vậy, phần còn thiếu của giải thích trang web Scala là 'phản hồi' không trả về _normally_ nhưng vẫn chấm dứt (có thể thông qua ngoại lệ?) Và được gọi là nhiều lần? – DNA

+0

Tôi không nghĩ đó là một 'phần còn thiếu'. Đó là chi tiết triển khai và không liên quan đến nhà phát triển. Các thông tin liên quan là trong khi (true) không hoạt động. Nếu bạn quan tâm đến các chi tiết bạn có thể xem xét các nguồn, tôi thường làm điều đó để hiểu mọi thứ tốt hơn. – drexin

+2

Nó có thể không liên quan nếu bạn chỉ làm theo công thức, nhưng nó là một trở ngại lớn trong giải thích, cho tôi - cho dù cái gì đó trả về hay không không phải là một chi tiết thực hiện (nếu bạn đang cố gắng lặp lại nó) cơ bản! Tôi đã xem nhanh các nguồn trước khi đặt câu hỏi nhưng tôi sẽ làm theo lời khuyên của bạn để đào sâu hơn một chút ... – DNA

1

Tôi tìm thấy một lời giải thích rằng câu trả lời phần a) của câu hỏi của tôi, trong one of Haller and Odersky's papers on Actors (nhấn mạnh của tôi dưới đây):

Ý tưởng trung tâm là như sau: Một diễn viên mà chờ đợi trong một nhận tuyên bố là không được đại diện bởi một chủ đề bị chặn mà bởi một đóng cửa mà nắm bắt phần còn lại của tính toán của diễn viên. Việc đóng cửa được thực hiện sau khi tin nhắn được gửi đến diễn viên khớp với một trong các mẫu thông báo được nhận trong thông báo nhận. Việc thực hiện việc đóng cửa là \ cõng" trên thread của người gửi.

Nếu việc đóng cửa tiếp nhận chấm dứt, kiểm soát được trả lại cho người gửi như một thủ tục lợi nhuận. Nếu các khối tiếp nhận đóng cửa trong một thứ hai tiếp nhận, kiểm soát được trả lại cho người gửi bằng cách ném một ngoại lệ đặc biệt rằng tháo của người nhận cuộc gọi stack.

một điều kiện cần thiết cho chương trình này để công việc là thu bao giờ trở lại thường để diễn viên kèm theo họ . Nói cách khác, không có mã nào trong một diễn viên có thể phụ thuộc vào việc chấm dứt hoặc kết quả của một khối nhận ...

+0

Tôi muốn xem liệu tôi có thể liên hệ với bạn về dự án phát triển/tư vấn có thể phù hợp với bạn không kỹ năng. Điều gì sẽ là một cách tốt để tiếp cận? – Jeremy

+0

Tiểu sử của tôi có email liên hệ - nhưng hiện tại tôi đã hoàn toàn bị chiếm dụng, xin lỗi. – DNA