2014-11-13 28 views
13
tài liệu

Các Akka được ghi lại các biến thể nguy hiểm của việc sử dụng Props:"Đóng để đóng phạm vi/lớp bao" nghĩa là gì?

// NOT RECOMMENDED within another actor: 
// encourages to close over enclosing class 
val props7 = Props(new MyActor) 

Sau đó mang về tuyên bố:

Phương pháp này không được khuyến khích để được sử dụng trong phạm vi diễn viên khác vì nó khuyến khích để đóng trên kèm theo phạm vi, dẫn đến Đạo cụ không thể tuần tự hóa và có thể là điều kiện chủng tộc (vi phạm sự đóng gói diễn viên).

Có thể ai đó vui lòng giải thích ý nghĩa của "đóng trên phạm vi bao quanh"? Đã tìm kiếm khắp nơi và không tìm thấy gì cả. Cảm ơn.

Trả lời

14

Hơi khó để thấy trong ví dụ này, rằng new Actor được chuyển thành tham số "được đặt tên". Hãy suy nghĩ về nó như thể nó được chuyển thành một chức năng của loại () => Actor. Hàm này sẽ được gọi mỗi lần diễn viên sẽ được (lại) tạo bởi người giám sát của nó trong khi khởi động lại.

Vấn đề là chức năng này là "đóng cửa" (rất dễ dàng với Google;)), có nghĩa là nó ghi lại và ghi nhớ mọi thứ trong phạm vi xung quanh mà nó cần (đôi khi, nhưng rất hiếm khi được gọi là "ngăn xếp ngăn xếp" "). Ví dụ: val f = (a: Int) => a + x. x xuất phát từ đâu? Nó xuất phát từ phạm vi xung quanh. Hàm litetal, được gán cho f được gọi là "thuật ngữ mở". Khi thực thi hàm literal trở thành một giá trị hàm (đó là một cách ưa thích để nói "đối tượng"), khi thực hiện đóng cụm từ mở, trong khi chụp mọi thứ trong phạm vi xung quanh. Đó là nơi mà cái tên "đóng cửa" xuất phát từ đó.

Đóng cửa rất hữu ích, nhưng bạn phải cẩn thận những gì bạn đóng cửa. Đôi khi, x là một số def hoặc thần cấm var, dẫn đến kết quả không thể đoán trước cho f, bởi vì bạn không có quyền kiểm soát thời gian khi f sẽ được gọi/thực thi. Hãy thử nó!

Hai chống paterns rất phổ biến trong Akka đang/đã:

  1. bế trên (bên ngoài) tham khảo this khi tạo một diễn viên từ một lớp bên trong.
  2. Đóng trên def sender khi trả lời thư có tương lai.

Tôi đưa cho bạn một loạt các thuật ngữ ưa thích để Google trên mục đích, btw;)

Chúc mừng và hạnh phúc mã hóa

+2

Cảm ơn. Giàu giải thích. – Peter

7

Là một bổ sung cho câu trả lời tốt @ agilesteel, một số tài liệu tham khảo:

Giải thích những gì đóng cửa là: Lập trình tại Scala, 8.7, đóng cửa

Giải thích lý do tại sao việc đóng cửa có thể gây ra vấn đề serialization: SIP-21 - Spores

Và đây là một ví dụ mã của việc tạo ra một đối tượng Props đó không phải là serializable vì đóng cửa trên một đối tượng phi serializable, dựa trên các ví dụ trong SIP-21:

case class Helper(name: String) 

object MyNonserializableObject { 

    val helper = Helper("the helper") 

    val props7 = Props(new MyActor(helper)) 
} 

Mặc dù helper chính nó là serializable, các "MyActor mới (helper)" được thông qua tên và do đó bắt this.helper, và this không serializable.

Bạn có thể thấy rằng các tham số diễn viên được truyền theo tên từ chữ ký của phương pháp Propsapply nơi có một ⇒ trong tham số creator:

def apply[T <: Actor](creator: ⇒ T)(implicit arg0: ClassTag[T]): Props 
+0

Cảm ơn sự đóng góp của bạn. – Peter

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