2014-04-09 12 views
9

Tôi đã làm việc dù gặp sự cố và nhận thấy một số mã nơi một lập trình viên trước đó đang truyền thông điệp bằng quy ước chuẩn của PID! Thông điệp. Tôi đã sử dụng gen_server: cast/2. Tôi đã tự hỏi nếu ai đó có thể giải thích cho tôi những khác biệt quan trọng và cân nhắc khi lựa chọn giữa hai?Erlang: sự khác biệt giữa việc sử dụng gen_server: cast/2 và thông báo tiêu chuẩn đi qua

Trả lời

15

Có một vài khác biệt nhỏ:

  • Rõ ràng, gen_server xử lý phôi trong handle_cast và tin nhắn "bình thường" trong handle_info.
  • Một diễn viên không bao giờ thất bại; nó luôn trả về ok. Gửi tin nhắn với ! không thành công với badarg nếu bạn đang gửi thư đến một nguyên tử hiện không được đăng ký bởi một quá trình. (Gửi tin nhắn đến một pid không bao giờ gây ra lỗi, ngay cả khi quá trình này đã chết.)
  • Nếu gen_server đang chạy trên một nút từ xa hiện không kết nối với nút cục bộ, thì gen_server:cast sẽ sinh ra một quá trình nền thiết lập kết nối và gửi tin nhắn, và quay lại ngay lập tức, trong khi ! chỉ trả về sau khi kết nối được thiết lập. (Xem mã cho gen_server:do_send.)

Để chọn khi nào hoặc loại kia, nó hầu như là vấn đề về hương vị. Tôi muốn nói rằng nếu thông điệp có thể được coi là một hàm API không đồng bộ cho gen_server, thì nó nên sử dụng tính năng truyền, có chức năng API cụ thể trong mô-đun gọi lại gen_server. Nghĩa là, thay vì gọi gen_server:cast trực tiếp, như thế này:

gen_server:cast(foo_proc, {some_message, 42}) 

thực hiện cuộc gọi chức năng:

foo_proc:some_message(42) 

và thực hiện các chức năng đó như các diễn viên trực tiếp ở trên. Điều đó gói gọn giao thức cụ thể của gen_server bên trong mô-đun riêng của nó.

Trong suy nghĩ của tôi, thông báo "đơn giản" sẽ được sử dụng cho các sự kiện, chứ không phải các cuộc gọi API. Một ví dụ sẽ được theo dõi tin nhắn, {'DOWN', Ref, process, Id, Reason}, và các sự kiện của một loại tương tự có thể xảy ra trong hệ thống của bạn.

4

Ngoài bài viết legoscia tôi sẽ nói rằng nó dễ dàng hơn để theo dõi API chức năng chuyên dụng hơn so với tin nhắn. Đặc biệt là trong môi trường prod.

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