zoukankan      html  css  js  c++  java
  • erlang进程监控:link和monitor

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

    进程双向监控-Link

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

    例子1:

    [plain] view plaincopy
    1. -module(test).  
    2. -export([start/0]).  
    3.   
    4. start() ->  
    5.     Pid = spawn(fun() ->loop() end),  
    6.     Pid2 = spawn(fun() ->loop_link(Pid) end),  
    7.     io:format("Pid ~p~nPid2 ~p~n", [Pid,Pid2]).  
    8.   
    9. loop_link(Pid) ->  
    10.     process_flag(trap_exit, true),  
    11.     erlang:link(Pid),  
    12.     receive  
    13.         Msg ->  
    14.             io:format("pid exit: ~p~n", [Msg])  
    15.     end.  
    16.   
    17. loop() ->  
    18.     process_flag(trap_exit, true),  
    19.     receive  
    20.         Msg ->  
    21.             io:format("pid2 exit: ~p~n", [Msg])  
    22.     end.  

    运行代码:

    [plain] view plaincopy
    1. 1> test:start().  
    2. Pid <0.63.0>  
    3. Pid2 <0.64.0>  
    4. ok  
    5. %% 杀掉Pid进程,进程Pid2收到通知  
    6. 2> exit(pid(0,63,0),kill).  
    7. pid exit: {'EXIT',<0.63.0>,killed}  
    8. true  
    9.   
    10. 3> test:start().  
    11. Pid <0.67.0>  
    12. Pid2 <0.68.0>  
    13. ok  
    14. %% 杀掉Pid2进程,进程Pid收到通知  
    15. 4> exit(pid(0,68,0),kill).  
    16. pid2 exit: {'EXIT',<0.68.0>,killed}  
    17. true  

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

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

    进程单向监控-Monitor

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

    例子2:

    [plain] view plaincopy
    1. -module(test).  
    2.   
    3. -export([start/0]).  
    4.   
    5. start() ->  
    6.     Pid = spawn(fun() ->loop() end),  
    7.     Pid3 = spawn(fun() ->loop_monitor(Pid) end),  
    8.     io:format("Pid ~p~nPid3 ~p~n", [Pid,Pid3]).  
    9.       
    10. loop_monitor(Pid) ->  
    11.     _MonitorRef = erlang:monitor(process, Pid),  
    12.     receive  
    13.         Msg ->  
    14.             io:format("pid exit: ~p~n", [Msg])  
    15.     end.  
    16.   
    17. loop() ->  
    18.     receive  
    19.         Msg ->  
    20.             io:format("pid3 exit: ~p~n", [Msg])  
    21.     end.      

    运行代码:

    [plain] view plaincopy
    1. 1> test:start().  
    2. Pid <0.39.0>  
    3. Pid3 <0.40.0>  
    4. ok  
    5. %% 杀掉Pid进程,进程Pid3收到通知  
    6. 2> exit(pid(0,39,0),kill).  
    7. pid exit: {'DOWN',#Ref<0.0.0.80>,process,<0.39.0>,killed}  
    8. true  
    9.   
    10. 3> test:start().  
    11. Pid <0.43.0>  
    12. Pid3 <0.44.0>  
    13. ok  
    14. %% 杀掉Pid3进程,进程Pid没有收到通知  
    15. 4> exit(pid(0,44,0),kill).  
    16. true  

    注:解除monitor监控用erlang:demonitor(MonitorRef)

    如果进程是以 normal 方式退出,erlang将不会发出进程退出通知

    [plain] view plaincopy
    1. 10> exit(pid(0,70,0), normal).  
    2. true  

    转自: http://blog.csdn.net/mycwq/article/details/13171117

  • 相关阅读:
    Centos7配置局域网yum源报错——Error downloading packages: failed to retrieve packages...
    Centos7扩展根分区——不增加磁盘
    Paxos算法
    记一次业务中的大坑-MYSQL有重复数据下的增加主键
    填坑之路——Hadoop分布式缓存
    Java接口技术
    Java-IO操作性能对比
    Clob对象转换为String
    剖析Reflection.getCallerClass
    Java类的加载、链接和初始化
  • 原文地址:https://www.cnblogs.com/unqiang/p/4581463.html
Copyright © 2011-2022 走看看