erlang最開始是為了電信產品而發展起來的語言,因為這樣的目的,決定了她對錯誤處理的嚴格要求。erlang除了提供exception,try catch等語法,還支援link和monitor兩種監控程序的機制,使得所有程序可以連線起來,組成乙個整體。當某個程序出錯退出時,其他程序都會收到該程序退出的訊息通知。有了這些特點,使用erlang建立乙個簡單,並且健壯的系統就不是什麼難事。
程序雙向監控-link
link方式可以建立程序之間的雙向鏈結關係,當其中乙個程序退出時,另乙個程序會收到該程序退出的訊息。
例子1:
[plain]view plain
copy
-module(test).
-export([start/0]).
start() ->
pid = spawn(fun() ->loop() end),
pid2 = spawn(fun() ->loop_link(pid) end),
io:format("pid ~p~npid2 ~p~n", [pid,pid2]).
loop_link(pid) ->
process_flag(trap_exit, true),
erlang:link(pid),
receive
msg ->
io:format("pid exit: ~p~n", [msg])
end.
loop() ->
process_flag(trap_exit, true),
receive
msg ->
io:format("pid2 exit: ~p~n", [msg])
end.
執行**:
[plain]view plain
copy
1> test:start().
pid <0.63.0>
pid2 <0.64.0>
ok
%% 殺掉pid程序,程序pid2收到通知
2> exit(pid(0,63,0),kill).
pid exit:
true
3> test:start().
pid <0.67.0>
pid2 <0.68.0>
ok
%% 殺掉pid2程序,程序pid收到通知
4> exit(pid(0,68,0),kill).
pid2 exit:
true
注:erlang程序預設不捕捉exit訊號,可以使用process_flag(trap_exit, true)改變這一預設行為。
注2:解除link監控用erlang:unlink(pid)
程序單向監控-monitor
monitor方式則實現程序的單向監控,當被監控程序退出時,監控程序會收到該程序退出的訊息。
例子2:
[plain]view plain
copy
-module(test).
-export([start/0]).
start() ->
pid = spawn(fun() ->loop() end),
pid3 = spawn(fun() ->loop_monitor(pid) end),
io:format("pid ~p~npid3 ~p~n", [pid,pid3]).
loop_monitor(pid) ->
_monitorref = erlang:monitor(process, pid),
receive
msg ->
io:format("pid exit: ~p~n", [msg])
end.
loop() ->
receive
msg ->
io:format("pid3 exit: ~p~n", [msg])
end.
執行**:
[plain]view plain
copy
1> test:start().
pid <0.39.0>
pid3 <0.40.0>
ok
%% 殺掉pid程序,程序pid3收到通知
2> exit(pid(0,39,0),kill).
pid exit:
true
3> test:start().
pid <0.43.0>
pid3 <0.44.0>
ok
%% 殺掉pid3程序,程序pid沒有收到通知
4> exit(pid(0,44,0),kill).
true
注:解除monitor監控用erlang:demonitor(monitorref)
如果程序是以 normal 方式退出,erlang將不會發出程序退出通知
[plain]view plain
copy
10> exit(pid(0,70,0), normal).
true
**:
erlang程序監控 link和monitor
分類 erlang mnesia 2013 10 27 17 15 322人閱讀收藏 舉報erlang erlang最開始是為了電信產品而發展起來的語言,因為這樣的目的,決定了她對錯誤處理的嚴格要求。erlang除了提供exception,try catch等語法,還支援link和monitor兩種...
Erlang程序池(整理)
關鍵字 erlang,程序池,開源 1.情景 專案中有很多連線zookeeper的地方,都是各自連線,儲存pid或者monitor,並在terminate或down的時候對連線進行關閉或者重連。可以考慮採用erlang程序池,對程序進行統一管理。2種需要採用程序池的情景 1.大量的普通erlang程...
Erlang應用系統內部狀態監控
開發乙個基於erlang otp的應用系統,實際上是構建了乙個由幾十萬甚至上百萬的erlang程序構成的乙個actor系統。系統的內部健康狀態完全可以由內部的程序狀態來體現。一般關心的程序狀態有 記憶體占用 訊息佇列大小 執行歸約數reduction等等。attach到乙個啟動的erlang節點的命...