Erlang:使用gen_server:cast/2和标准消息传递之间的区别

Roc*_*igh 10 erlang asynchronous gen-server

我正在解决一个问题并注意到一些代码,其中一位前任程序员使用PID的标准约定传递消息!信息.我一直在使用gen_server:cast/2.我想知道是否有人可以向我解释两者之间选择时的关键差异和考虑因素?

leg*_*cia 15

有一些细微的差别:

  • 显然,gen_server处理强制转换handle_cast和"普通"消息handle_info.
  • 演员从未失败; 它总是回归ok.发送消息以!将失败,badarg如果要发送的消息到当前不是通过过程注册的原子.(即使进程已经死亡,向pid发送消息也不会导致错误.)
  • 如果gen_server正在当前未连接到本地节点的远程节点上运行,那么gen_server:cast将生成后台进程以建立连接并发送消息,并立即返回,而!只有在建立连接后才返回.(参见代码gen_server:do_send.)

至于什么时候选择其中一个,这主要是品味问题.我要说如果消息可以被认为是gen_server的异步API函数,那么它应该使用强制转换,在gen_server回调模块中具有特定的API函数.也就是说,而不是gen_server:cast直接调用,如下所示:

gen_server:cast(foo_proc, {some_message, 42})
Run Code Online (Sandbox Code Playgroud)

打一个函数调用:

foo_proc:some_message(42)
Run Code Online (Sandbox Code Playgroud)

并实现像上面的直接演员那样的功能.它将gen_server的特定协议封装在其自己的模块中.

在我看来,"普通"消息将用于事件,而不是API调用.一个示例是监视器消息,{'DOWN', Ref, process, Id, Reason}以及系统中可能发生的类似事件.


use*_*720 5

除了legoscia帖子之外,我会说跟踪专用函数API比消息更容易.特别是在生产环境中.