Asynchronous Erlang:使用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_服务器运行在当前未连接到本地节点的远

我当时正在处理一个问题,注意到一些代码,其中一位以前的程序员使用PID的标准约定传递消息!消息我一直在使用gen_server:cast/2。我想知道是否有人能向我解释在两者之间进行选择时的关键区别和注意事项?

有一些细微的区别:

  • 显然,gen_服务器处理
    handle_cast
    中的强制转换和
    handle_info
    中的“正常”消息
  • 演员从不失败;它总是返回
    ok
    。发送带有
    的消息将使用
    badarg
    失败。(向pid发送消息不会导致错误,即使进程已停止。)
  • 如果gen_服务器运行在当前未连接到本地节点的远程节点上,则
    gen_服务器:cast
    将生成一个后台进程以建立连接并发送消息,并立即返回,而
    仅在建立连接后返回。(参见
    gen\u server:do\u send
    的代码)
至于什么时候选一个或另一个,主要是口味的问题。我想说,如果消息可以被认为是gen_服务器的异步API函数,那么它应该使用cast,并在gen_服务器回调模块中具有特定的API函数。也就是说,不要直接调用
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比跟踪消息更容易。特别是在产品环境中