一、handle_call與handle_cast
handle_call處理顯式調(diào)用gen_server:call產(chǎn)生的消息榨惰,
同樣拜英,handle_cast處理顯式調(diào)用gen_server:cast所產(chǎn)生的消息。
不同的是琅催,前者是同步的居凶,后者是異步的(不關(guān)心返回值)。
二藤抡、handle_info
handle_info這個(gè)回調(diào)函數(shù)被用來(lái)處理發(fā)給服務(wù)器的自發(fā)性消息侠碧,比如別的進(jìn)程通過(guò)!發(fā)來(lái)的消息,又或者是exit信號(hào)缠黍,一切未顯式調(diào)用gen_server:call和gen_server:cast的消息都會(huì)到handle_info里
三弄兜、rpc:call與gen_server:call
1.rpc:call/4和rpc:call/5其實(shí)本質(zhì)上都是調(diào)用到了gen_server:call/3,這里的特殊點(diǎn)是:這里的目標(biāo)進(jìn)程是{?NAME,Node}瓷式,進(jìn)入gen_server模塊之后替饿,加上'$gen_call'參數(shù)后繼續(xù)向下調(diào)用,傳遞到gen模塊
2.到了gen模塊后贸典,首先調(diào)用erlang:monitor(process, Process)函數(shù)來(lái)確定目標(biāo)進(jìn)程或者是結(jié)點(diǎn)的存活狀態(tài)视卢,而實(shí)際上數(shù)據(jù)發(fā)送是通過(guò)erlang:send(Process, {Label, {self(), Mref}, Request},[noconnect])來(lái)實(shí)現(xiàn)的。在發(fā)送完消息后廊驼,就進(jìn)入了receive的阻塞狀態(tài)据过,實(shí)際上在gen模塊的阻塞狀態(tài)中依舊有超時(shí)控制。這樣一個(gè)帶有Timeout的rpc:call/5其實(shí)會(huì)因?yàn)閞eceive而阻塞兩次妒挎,同時(shí)還會(huì)創(chuàng)建一個(gè)新的中間進(jìn)程绳锅,其目的是為了防止call長(zhǎng)時(shí)間超時(shí)帶來(lái)的進(jìn)程阻塞危害。