一直對erlang的group_leader這個概念很困惑,因為*nix系統也有類似的名詞但是只是和進程組管理有關系。查了很多文檔才知道,erlang的group_leader的設計意圖和作用,解釋如下:
先看下著段代碼運作:
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控制臺的輸出到那個進程。
這個特性很有幫助。我們在做服務器程序的時候 會有大量的診斷信息通過類似printf打印需要輸出到控制臺查看。 代碼里東一塊西一塊都是診斷代碼, 而且一旦程序調試完畢 我們可能不在需要這些信息污染環境。這個是單機的情況,對于分布式的情況就更復雜,很難把其他主機上打出的診斷信息匯總到一個地方集中查看。
group_leader就是解決這個問題的。 erlang里面的io:format之類的函數執行的時候最早輸出會被重定向到該進程的group_leader進程去,而且進程是位置無關的,也就是說在其他主機上的信息都可以匯總。
有了這個特性 比如說我在其他的機器上執行條rpc命令 這個命令的結果是會被截獲 傳送回來的 而不是要到目標主機的終端上顯示。
group_leader是繼承的,每當spawn一個進程的時候,會自動繼承父進程的這個屬性。rpc的實現上也很大努力保證了這個語義不變。
在實踐中也要注意這個特性的副作用,就是: 你用rpc執行的命令 就是想在目標機器上顯示結果 但是看不到 因為被截獲了。
安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢】
group_leader的設計和用途
2010-01-13 23:18:17 作者: 來源:
上一篇:使用EUnit進行單元測試
下一篇:方便調試erlang程序的腳本