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
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" tronghandle_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ớibadarg
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ã chogen_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, và 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.
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.
- 1. Trong Erlang, sự khác biệt giữa gen_server: start() và gen_server: start_link() là gì?
- 2. Sự khác biệt giữa việc chờ thông báo và CountDownLatch
- 3. Sự khác biệt giữa việc sử dụng UINavigationController và UINavigationBar
- 4. Khi sử dụng gen_server trong các ứng dụng Erlang/OTP
- 5. Sự khác biệt giữa việc sử dụng StringTokenizer và String.split()?
- 6. Sự khác biệt giữa việc sử dụng Trace và TraceSource
- 7. Sự khác biệt giữa việc sử dụng @OneToMany và @ManyToMany
- 8. Sự khác biệt giữa Thông báo và pynotify là gì?
- 9. Sự khác nhau giữa việc sử dụng? và: param trong câu lệnh chuẩn bị
- 10. kênh chặn và thông báo không đồng bộ đi qua
- 11. Sự khác biệt giữa các con trỏ thông minh Boost và con trỏ thông minh tiêu chuẩn là gì?
- 12. Sự khác biệt chính giữa tiêu chuẩn mã hóa PSR-2 và tiêu chuẩn mã Symfony2 cho phpcs là gì?
- 13. Sự khác biệt giữa Thông báo Đẩy và Thông báo Kéo?
- 14. Sự khác biệt giữa việc truy cập một phương thức lớp thông qua -> và thông qua :: là gì?
- 15. Sự khác biệt trong loại giữa việc sử dụng và không sử dụng Đặt từ khóa
- 16. Sự khác biệt giữa việc sử dụng ObjectIdentifier() và '===' Toán tử
- 17. Sự khác biệt giữa việc sử dụng Modulename; và sử dụng Modulename();
- 18. Sự khác biệt giữa $ * và $ @
- 19. Có sự khác biệt nào giữa việc thiết lập JAVA_HOME thông qua dòng cmd hoặc GUI
- 20. Sự khác biệt giữa _ và tự. trong Mục tiêu-C
- 21. Sự khác biệt giữa sự khác biệt biểu tượng và sự khác biệt tự động?
- 22. Java: Sự khác biệt giữa các tiêu chuẩn vĩ mô và vi mô
- 23. Sự khác biệt giữa $ (...) và `...`
- 24. Sự khác biệt giữa std :: function <> và một con trỏ hàm tiêu chuẩn?
- 25. Sự khác biệt về PHP giữa thông báo và cảnh báo
- 26. Tại sao nhận được sự khác biệt giữa việc sử dụng XCode và xcodebuild?
- 27. UINavigationItem: Sự khác biệt giữa tiêu đề và lời nhắc
- 28. Erlang erl_call khiến mô-đun gen_server thoát
- 29. Sự khác biệt giữa glTexParameter và glSamplerParameter
- 30. Sự khác biệt giữa Monitor.Pulse và Monitor.PulseAll