Asynchronous Erlang:使用gen_server:cast/2和标准消息传递之间的区别
我当时正在处理一个问题,注意到一些代码,其中一位以前的程序员使用PID的标准约定传递消息!消息我一直在使用gen_server:cast/2。我想知道是否有人能向我解释在两者之间进行选择时的关键区别和注意事项?有一些细微的区别:Asynchronous Erlang:使用gen_server:cast/2和标准消息传递之间的区别,asynchronous,erlang,gen-server,Asynchronous,Erlang,Gen Server,我当时正在处理一个问题,注意到一些代码,其中一位以前的程序员使用PID的标准约定传递消息!消息我一直在使用gen_server:cast/2。我想知道是否有人能向我解释在两者之间进行选择时的关键区别和注意事项?有一些细微的区别: 显然,gen_服务器处理handle_cast中的强制转换和handle_info中的“正常”消息 演员从不失败;它总是返回ok。发送带有的消息将使用badarg失败。(向pid发送消息不会导致错误,即使进程已停止。) 如果gen_服务器运行在当前未连接到本地节点的远
- 显然,gen_服务器处理
中的强制转换和handle_cast
中的“正常”消息handle_info
- 演员从不失败;它总是返回
。发送带有ok
的消息如果您正在向当前未由进程注册的atom发送消息,则代码>将使用
失败。(向pid发送消息不会导致错误,即使进程已停止。)badarg
- 如果gen_服务器运行在当前未连接到本地节点的远程节点上,则
将生成一个后台进程以建立连接并发送消息,并立即返回,而gen_服务器:cast
代码>仅在建立连接后返回。(参见
的代码)gen\u server:do\u send
gen_server:cast
,如下所示:
gen_server:cast(foo_proc, {some_message, 42})
进行函数调用:
foo_proc:some_message(42)
并像上面的直接转换一样实现该功能。它将gen_服务器的特定协议封装在自己的模块中
在我看来,“普通”消息将用于事件,而不是API调用。例如监视消息、
{'DOWN',Ref,process,Id,Reason}
,以及系统中可能发生的类似事件。除了Legocia post之外,我想说跟踪专用函数API比跟踪消息更容易。特别是在产品环境中