Roc*_*igh 10 erlang asynchronous gen-server
我正在解决一个问题并注意到一些代码,其中一位前任程序员使用PID的标准约定传递消息!信息.我一直在使用gen_server:cast/2.我想知道是否有人可以向我解释两者之间选择时的关键差异和考虑因素?
leg*_*cia 15
有一些细微的差别:
handle_cast和"普通"消息handle_info.ok.发送消息以!将失败,badarg如果要发送的消息到当前不是通过过程注册的原子.(即使进程已经死亡,向pid发送消息也不会导致错误.)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}以及系统中可能发生的类似事件.
| 归档时间: |
|
| 查看次数: |
1275 次 |
| 最近记录: |