我正在通过一个问题工作,并注意到一些代码,以前的程序员使用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字节码之间的区别