设为首页收藏本站

Erlang中文论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14988|回复: 0
打印 上一主题 下一主题

持续更新。。。。

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-22 01:14:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  这段代码是我刚从书上看到的,虽然学过erlang的人都见过,但我还是想分享下这段巧妙的代码
-module(my_supervisor).
-export([start_link/2,stop/1]).
-export([init/1]).
start_link(Name,ChildSpecList) ->
   register(Name,spwan_link(my_supervisor,init,[ChildSpecList])),ok. %注册了一个Name的监控

init(ChildSpecList) ->
  process_flag(trap_exit,true), %允许接受进程
  loop(start_children(ChildSpecList)).

start_children([]) -> [];
start_children([{M,F,A}|ChildSpecList]) -> %M-模块名 ,F-函数名,A- 参数
    case (catch apply(M,F,A)) of            %apply/3本网站有介绍
       {ok,Pid}  ->     
            [{Pid,{M,F,A}}|start_children(ChildSpecList)];%最后得出一个列表
       _ ->
            start_children(ChildSpecList)
    end.
%重启子进程
restart_child(Pid,ChildList) ->
  {value,{Pid,{M,F,A}}} = lists:keysearch(Pid,1,ChildList),
  {ok,NewPid} = apply(M,F,A),
  [{NewPid,{M,F,A}}|lists:keydelete(Pid,1,ChildList)].

loop(ChileList) ->
  receive
    {'EXIT',Pid,_Reason} ->
         NewChildList = restart_child(Pid,ChildList),
         loop( NewChildList);
    {stop,From} ->
         From ! {reply,terminate(ChildList)}
  end.

stop(Name) ->
   Name ! {stop,self()},
  receive {reply,Reply} -> Reply end.
%循环结束ChildList中的子进程
terminate([{Pid,_}|ChildList]) ->
  exit(Pid,kill),
  terminnate(ChildList);
terminate(_ ChildList) -> ok.

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|Erldoc.com  

GMT+8, 2024-4-25 15:54 , Processed in 0.361313 second(s), 9 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表