2011-09-02 26 views
6

Điều gì xảy ra với tin nhắn hộp thư đến chưa đọc trong Scala Actors? Ví dụ hai trường hợp:

1.If quên để thực hiện phản ứng trường hợp đối với thông điệp đặc biệt:

actor!NoReactCaseMessage

2. Nếu thông điệp đến quá nhanh:

(timeOfProcessingMessage > timeOfMessageComes)

Nếu trường hợp đầu tiên hoặc thứ hai xảy ra, nó sẽ được xếp chồng lên nhau trong ký ức?Scala, diễn viên, điều gì sẽ xảy ra với các tin nhắn trong hộp thư đến chưa đọc?

CHỈNH SỬA 1 Có cơ chế nào để xem loại rò rỉ bộ nhớ này đang xảy ra không? Có thể, kiểm soát số lượng tin nhắn chưa đọc sau đó làm cho một số rác thu thập hoặc tăng hồ bơi diễn viên. Cách nhận số lượng tin nhắn chưa đọc? Làm thế nào loại rò rỉ bộ nhớ này được giải quyết bằng các ngôn ngữ khác? Ví dụ: Erlang?

Trả lời

8

Hộp thư là một hàng đợi - nếu không có gì là kéo những thông điệp từ hàng đợi (Ví dụ: nếu chức năng một phần trong react hoặc receive bạn loop trả false cho isDefinedAt), sau đó các thông điệp chỉ ở lại đó.

Nói đúng cách đây là rò rỉ bộ nhớ (của ứng dụng của bạn), mặc dù mức độ nghiêm trọng của nó phụ thuộc vào cách các thông điệp chưa đọc này phát triển về số lượng (hiển nhiên). Ví dụ: tôi thường sử dụng diễn viên để hợp nhất trong truy vấn phát lại và "luồng trực tiếp" của thư được xác định bằng số thứ tự. Phản ứng của tôi trông như thế này:

var lastSeq = 0L 
loop { 
    react { 
    case Msg(seq, data) if seq > lastSeq => lastSeq = seq; process(data) 
    } 
} 

này chứa một rò rỉ bộ nhớ, nhưng không phải là một "nghiêm trọng" một, như sẽ có một trên ràng buộc về số lượng các thông điệp trùng lặp (tức là không thể có một lần nữa phát lại truy vấn đã kết thúc).

Tuy nhiên, điều này vẫn có thể gây phiền toái, đối với mỗi phản ứng, hệ thống phụ diễn viên sẽ quét lại các thông báo đó để xem liệu chúng có thể được xử lý hay không.

Trong thực tế, suy nghĩ về một hộp thư thực có thể là một sự tương tự tốt ở đây. Hãy tưởng tượng bạn để lại tất cả thư rác trong đó: khá sớm, bạn sẽ bị đói đói vì tất cả thư rác bạn sẽ phải sàng lọc để nhận được bảng sao kê thẻ tín dụng.

3

Cách rò rỉ bộ nhớ này được giải quyết bằng các ngôn ngữ khác? Ví dụ trong Erlang?

Tương tự như trong Scala. Vấn đề đầu tiên:

  1. Nếu quên để thực hiện phản ứng trường hợp đối với thông điệp đặc biệt

Bạn rất hiếm khi cần để lại tin nhắn trong hộp thư cố ý và nhận nó sau này. Tôi chưa bao giờ gặp phải một tình huống như vậy. Vì vậy, bạn luôn có thể bao gồm một mệnh đề catch-all (case _ => ... trong Scala), sẽ không làm gì cả, đăng nhập cảnh báo hoặc ném một ngoại lệ - bất kỳ điều gì có ý nghĩa nhất trong tình huống của bạn.

  1. Nếu thông điệp đến quá nhanh

Thay vì gửi tin nhắn trực tiếp tới một quá trình mà không thể xử lý đủ nhanh, thêm một quá trình đệm. Nó có thể vứt bỏ thêm tin nhắn, gửi chúng đến nhiều hơn một quy trình công nhân, v.v.

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