我正在通過一個問題工作,並注意到一些代碼,以前的程序員使用PID的標準約定傳遞消息!信息。我一直在使用gen_server:cast/2。我想知道是否有人能夠向我解釋在兩者之間進行選擇時的關鍵區別和考慮事項?Erlang:使用gen_server:cast/2和標準消息傳遞之間的區別
9
A
回答
15
有一些細微差別:
- 顯然,gen_server處理中
handle_cast
鑄件和 「正常」 的消息在handle_info
。 - 演員永遠不會失敗;它總是返回
ok
。如果發送消息給當前未被進程註冊的原子,則發送帶有!
的消息將失敗,並返回badarg
。 (即使進程已經停止,向pid發送消息也不會導致錯誤。) - 如果gen_server正在當前未連接到本地節點的遠程節點上運行,那麼
gen_server:cast
會產生一個後臺進程建立連接併發送消息,並立即返回,而!
僅在連接建立時返回。 (請參閱gen_server:do_send
的編碼。)
至於什麼時候選擇其中之一,主要是品味問題。我想說如果消息可以被認爲是gen_server的異步API函數,那麼它應該使用cast,和在gen_server回調模塊中具有特定的API函數。也就是說,而不是調用gen_server:cast
直接,就像這樣:
gen_server:cast(foo_proc, {some_message, 42})
進行函數調用:
foo_proc:some_message(42)
和實施類似上面直接鑄造該功能。它將gen_server的特定協議封裝在自己的模塊中。
在我看來,「簡單」消息將用於事件,而不是API調用。一個例子是監視器消息,{'DOWN', Ref, process, Id, Reason}
,以及可能在系統中發生的類似事件。
4
除了legoscia發佈,我會說跟蹤消息比追蹤專用函數API更容易。特別是在產品環境中。
相關問題
- 1. 在erlang進程之間傳遞消息?
- 2. 代表使用Erlang的消息傳遞
- 3. msgpack:C++和java之間的消息傳遞
- 4. 消息傳遞變量和「直接」erlang
- 5. Erlang新手 - 併發和消息傳遞
- 6. FCM - 下游消息和上游消息之間的區別
- 7. 消息傳遞和共享內存併發模型之間有什麼區別?
- 8. 使用消息隊列在進程之間傳遞消息
- 9. IPC over Socket - 消息傳遞標準
- 10. Spring MVC:spring之間的區別:消息和請求區域設置
- 11. CMS中的標籤和分類標準之間的區別?
- 12. 兩個類之間的消息傳遞
- 13. C++中傳遞值與傳遞引用之間的區別
- 14. 消息傳遞和方法調用有什麼區別?
- 15. Lisp Flavored Erlang - 消息傳遞原語
- 16. 將消息從C傳遞給erlang
- 17. VueJS - 傳遞函數名稱和調用之間的區別
- 18. PHP在頁面之間傳遞消息
- 19. 在Backbone.js之間傳遞消息Views
- 20. 在EventMachine連接之間傳遞消息
- 21. 消息生成器和消息格式化程序之間的區別以及如何使用消息中繼?
- 22. Erlang如何在同一個節點上的進程之間傳遞消息?
- 23. 模擬準備和直接準備調用之間的區別?
- 24. ninject的標準和非web版本之間的區別
- 25. 回溯和遞歸之間的區別?
- 26. 消息映射和覆蓋windowproc之間的區別
- 27. 消息隊列和郵箱之間的區別
- 28. 消息傳遞代理和緩衝區
- 29. C標準庫和C POSIX庫之間的區別
- 30. 標準Lua字節碼和LuaJIT字節碼之間的區別