您的位置:首页 > 运维架构

erlang进程监控:link和monitor

2015-06-16 18:04 141 查看
Erlang最开始是为了电信产品而发展起来的语言,因为这样的目的,决定了她对错误处理的严格要求。Erlang除了提供exception,try catch等语法,还支持Link和Monitor两种监控进程的机制,使得所有进程可以连接起来,组成一个整体。当某个进程出错退出时,其他进程都会收到该进程退出的消息通知。有了这些特点,使用erlang建立一个简单,并且健壮的系统就不是什么难事。

进程双向监控-Link

link方式可以建立进程之间的双向链接关系,当其中一个进程退出时,另一个进程会收到该进程退出的消息。

例子1:

[plain] view plaincopy

-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 plaincopy

1> test:start().

Pid <0.63.0>

Pid2 <0.64.0>

ok

%% 杀掉Pid进程,进程Pid2收到通知

2> exit(pid(0,63,0),kill).

pid exit: {'EXIT',<0.63.0>,killed}

true

3> test:start().

Pid <0.67.0>

Pid2 <0.68.0>

ok

%% 杀掉Pid2进程,进程Pid收到通知

4> exit(pid(0,68,0),kill).

pid2 exit: {'EXIT',<0.68.0>,killed}

true

注:erlang进程默认不捕捉Exit信号,可以使用process_flag(trap_exit, true)改变这一默认行为。

注2:解除link监控用erlang:unlink(Pid)

进程单向监控-Monitor

Monitor方式则实现进程的单向监控,当被监控进程退出时,监控进程会收到该进程退出的消息。

例子2:

[plain] view plaincopy

-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 plaincopy

1> test:start().

Pid <0.39.0>

Pid3 <0.40.0>

ok

%% 杀掉Pid进程,进程Pid3收到通知

2> exit(pid(0,39,0),kill).

pid exit: {'DOWN',#Ref<0.0.0.80>,process,<0.39.0>,killed}

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 plaincopy

10> exit(pid(0,70,0), normal).

true



转自: /article/1344938.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: