erlang程序監控 link和monitor

2022-03-19 15:34:31 字數 2834 閱讀 7879

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節點的命...