erlang进程监控:link和monitor
2015-06-16 18:04
253 查看
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
进程双向监控-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
相关文章推荐
- Linux_1.5_makefile工程管理
- Hadoop第三讲
- Linux Shell 之 Shell中的函数调用
- Linux Shell 之 Shell中的函数调用
- 利用Openbabel将SMILES转化为canonical SMILES
- ubuntu 14.04(trusty)下搭建本地docker regestry
- 请问JAVA三层架构,持久层,业务层,表现层,都该怎么理解?和MVC三层模型有什么区别
- 每天进步一点点——linux——mv
- 找工作相关网站
- Lucene 简单案例
- 基于Keepalived实现LVS双主高可用集群 推荐
- linux,apache,php,mysql常用的查看版本信息的方法
- opencv学习笔记1:矩阵和图像基本操作
- iOS应用架构谈(三):View层的组织和调用方案(下)(转帖)
- iOS应用架构谈(二):View层的组织和调用方案(中)(转帖)
- iOS应用架构谈(二):View层的组织和调用方案(上)(转帖)
- 关于LINUX打PACTH简单记载
- iOS应用架构谈(一):架构设计的方法论 (转帖)
- Linux下Apache PHP MYSQL 默认安装路径
- LVS+Keepalived+Nginx+Tomcat高可用负载均衡集群配置(DR模式,一个VIP,多个端口)