一、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长时间超时带来的进程阻塞危害。
网友评论