{ok, State},就不用說了,一切正常,State將爲gen_server的State;
{ok, State, Timeout},也很正常,只是若是process在Timeout(>=0,ms)時間內沒有收到任何消息,那麼將產生一個timeout消息,這個消息要在handle_info中處理哦。
{ok, State, hibernate}, 仍是正常,只是咱們在process啓動後,就讓它先」睡眠「,由於咱們知道最近一段時間內,咱們還不用這個process,此process睡眠的好處就是能夠最大限度的減小其內存佔用,當有消息到達時,process就會」驚醒「,從新工做。
{stop, Reason},oops,出錯了,process將會調用exit(Reason)退出。若是init沒有預期,咱們就退出吧。
ingore,既然要求忽略了,什麼都不作,退出吧。
4, gen_server:multi_call/2,3,4這幾個哥們是幹嗎用的?
multi就是多的意思嘛,mulit_call確定就是進行多個調用請求哦。
先說他們的關係:
gen_server:multi_call(Name, Request)
= gen_server:multi_call([node() | nodes()], Name, Request)
= gen_server:multi_call([node() | nodes()], Name, Request, infinity)
稱他們爲兄弟,我看稱他們爲三胞胎還不錯。
想多個node請求本地名爲Name的gen_server behaviour, 而後收集結果,返回。
其返回值格式爲:{Replies,BadNodes},其中Replies爲[{Node, Reply}],BadNodes,不用說就是那些沒有正常返回應答的節點了。
mulit_call/4最後一個Time參數指定的是每一個Reply等待的超時時間。
5, gen_server:reply/2有嘛用處?
若是在Module:handle_call/3中,咱們不能返回結果,咱們能夠保存handle_call中的From參數,在結果生成的時候,返回給Caller。
6, Module:handle_call/3 返回{noreply,NewState}會怎樣?
怎樣?明明是handle_call處理的是同步的請求,處理完了就應該告訴Caller,是死是活,是成功是失敗,但是你noreply,
Caller只能傻傻的等待了。等多久?默認的是5秒,gen_server:call/3就調用exit({timeout, Description}),退出了。。
7, 我用gen_server居然死鎖了?
天呀,在erlang中怎麼遇到鎖了?確定是你使用不當!
name() ->
gen_server:call(?SERVER, name).
address() ->
gen_server:call(?SERVER, address).
all_info() ->
gen_server:call(?SERVER, all_info).
.....
handle_call(all_info, _From, State) ->
Name = name(),
Address = address(),
{reply, {Name, Address}, State};
這麼寫,活該你死鎖。 handle_call是同步調用,你在內部又調用name(), address(),能不鎖麼? 要求就是:不要在handle_call/3內部調用另外一個gen_server:call相關的函數。