一直對erlang的group_leader這個(gè)概念很困惑,因?yàn)?nix系統(tǒng)也有類似的名詞但是只是和進(jìn)程組管理有關(guān)系。查了很多文檔才知道,erlang的group_leader的設(shè)計(jì)意圖和作用,解釋如下:
先看下著段代碼運(yùn)作:
log_group_leader(OGL) ->
receive Msg ->
io:format(user, "Got message ~p~n",[Msg]),
OGL ! Msg,
log_group_leader(OGL)
end.
ioclient(NGL) ->
group_leader(NGL, self()),
io:format("Hello World~n"),
io:format("Hello again~n").
iotest() ->
OldGroupLeader = group_leader(),
NewGroupLeader = spawn(?MODULE, log_group_leader, [OldGroupLeader]),
spawn(?MODULE, ioclient, [NewGroupLeader]).
說白了group_leader就是決定erlang的io控制臺的輸出到那個(gè)進(jìn)程。
這個(gè)特性很有幫助。我們在做服務(wù)器程序的時(shí)候 會有大量的診斷信息通過類似printf打印需要輸出到控制臺查看。 代碼里東一塊西一塊都是診斷代碼, 而且一旦程序調(diào)試完畢 我們可能不在需要這些信息污染環(huán)境。這個(gè)是單機(jī)的情況,對于分布式的情況就更復(fù)雜,很難把其他主機(jī)上打出的診斷信息匯總到一個(gè)地方集中查看。
group_leader就是解決這個(gè)問題的。 erlang里面的io:format之類的函數(shù)執(zhí)行的時(shí)候最早輸出會被重定向到該進(jìn)程的group_leader進(jìn)程去,而且進(jìn)程是位置無關(guān)的,也就是說在其他主機(jī)上的信息都可以匯總。
有了這個(gè)特性 比如說我在其他的機(jī)器上執(zhí)行條rpc命令 這個(gè)命令的結(jié)果是會被截獲 傳送回來的 而不是要到目標(biāo)主機(jī)的終端上顯示。
group_leader是繼承的,每當(dāng)spawn一個(gè)進(jìn)程的時(shí)候,會自動(dòng)繼承父進(jìn)程的這個(gè)屬性。rpc的實(shí)現(xiàn)上也很大努力保證了這個(gè)語義不變。
在實(shí)踐中也要注意這個(gè)特性的副作用,就是: 你用rpc執(zhí)行的命令 就是想在目標(biāo)機(jī)器上顯示結(jié)果 但是看不到 因?yàn)楸唤孬@了。
安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢】
group_leader的設(shè)計(jì)和用途
2010-01-13 23:18:17 作者: 來源:
相關(guān)熱詞搜索:用途 設(shè)計(jì)