美文网首页
[Erlang开发之路]二十二点四、gen_server回调函数

[Erlang开发之路]二十二点四、gen_server回调函数

作者: 循环不计次 | 来源:发表于2019-07-29 19:59 被阅读0次

    一、handle_call与handle_cast

    handle_call处理显式调用gen_server:call产生的消息,
    同样,handle_cast处理显式调用gen_server:cast所产生的消息。
    不同的是,前者是同步的,后者是异步的(不关心返回值)。

    二、handle_info

    handle_info这个回调函数被用来处理发给服务器的自发性消息,比如别的进程通过!发来的消息,又或者是exit信号,一切未显式调用gen_server:call和gen_server:cast的消息都会到handle_info里

    三、rpc:call与gen_server:call

    1.rpc:call/4和rpc:call/5其实本质上都是调用到了gen_server:call/3,这里的特殊点是:这里的目标进程是{?NAME,Node},进入gen_server模块之后,加上'$gen_call'参数后继续向下调用,传递到gen模块
    2.到了gen模块后,首先调用erlang:monitor(process, Process)函数来确定目标进程或者是结点的存活状态,而实际上数据发送是通过erlang:send(Process, {Label, {self(), Mref}, Request},[noconnect])来实现的。在发送完消息后,就进入了receive的阻塞状态,实际上在gen模块的阻塞状态中依旧有超时控制。这样一个带有Timeout的rpc:call/5其实会因为receive而阻塞两次,同时还会创建一个新的中间进程,其目的是为了防止call长时间超时带来的进程阻塞危害。

    相关文章

      网友评论

          本文标题:[Erlang开发之路]二十二点四、gen_server回调函数

          本文链接:https://www.haomeiwen.com/subject/jtmirctx.html