关于erlang supervisor ,书上没有讲到的细节

转载 2018年04月16日 15:10:11
今天写代码,想要得到一个supervisor下面挂的所有 worker数量,

我 通过dynamic的方式启动这些worker的:
    XXWorker = {"xx_worker" ++ util:uuid(),
             {xx_worker, start_link,[Task]},
             temporary, 5000, worker, dynamic},
    ?DEBUG("sup before call start_child~n", []),
    supervisor:start_child(xx_sup, XXWorker),
%xx_sup是一个已经启动的gen_server.

查 api,找到这个函数:which_children(SupRef) -> [{Id,Child,Type,Modules}]
但 是我自己用这个函数,却总是不能得到worker进程,
?VALUE(supervisor:which_children(xx_sup) ),
app_mon可以得到进程树,于是我想用app_mon里面的方法,未果,
后来看 supervisor的代码,
do_start_child_i(M, F, A) ->
    case catch apply(M, F, A) of
    {ok, Pid} when is_pid(Pid) ->
        {ok, Pid};
    {ok, Pid, Extra} when is_pid(Pid) ->
        {ok, Pid, Extra};
    ignore ->
        {ok, undefined};
    {error, Error} ->
        {error, Error};
    What ->
        {error, What}
    end.

handle_call({start_child, EArgs}, _From, State) when ?is_simple(State) ->
    #child{mfa = {M, F, A}} = hd(State#state.children),
    Args = A ++ EArgs,
    case do_start_child_i(M, F, Args) of
    {ok, Pid} ->
        NState = State#state{dynamics =
                 ?DICT:store(Pid, Args, State#state.dynamics)},
        {reply, {ok, Pid}, NState};
    {ok, Pid, Extra} ->
        NState = State#state{dynamics =
                 ?DICT:store(Pid, Args, State#state.dynamics)},
        {reply, {ok, Pid, Extra}, NState};
    What ->
        {reply, What, State}
    end;
就 是说,要M:F(A) 返回的结果是个{ok, Pid} 才会被加入到DICT里面去,
supervisor:which_children()的 时候才会出来,
而我自己的xx_work:start_link() 只是简单的返回了ok.
再看看其它 gen_server:start_link(), 都是这样写的:
start_link() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
查gen_server源码,发现它的start_link 返回就是:  {'ok', pid()} | 'ignore' | {'error', term()}

于是,我把自己的 xx_work:start_link()  返回{ok, Pid}. 搞定.今天写代码,想要得到一个supervisor下面挂的所有 worker数量,

我 通过dynamic的方式启动这些worker的:
    XXWorker = {"xx_worker" ++ util:uuid(),
             {xx_worker, start_link,[Task]},
             temporary, 5000, worker, dynamic},
    ?DEBUG("sup before call start_child~n", []),
    supervisor:start_child(xx_sup, XXWorker),
%xx_sup是一个已经启动的gen_server.

查 api,找到这个函数:which_children(SupRef) -> [{Id,Child,Type,Modules}]
但 是我自己用这个函数,却总是不能得到worker进程,
?VALUE(supervisor:which_children(xx_sup) ),
app_mon可以得到进程树,于是我想用app_mon里面的方法,未果,
后来看 supervisor的代码,
do_start_child_i(M, F, A) ->
    case catch apply(M, F, A) of
    {ok, Pid} when is_pid(Pid) ->
        {ok, Pid};
    {ok, Pid, Extra} when is_pid(Pid) ->
        {ok, Pid, Extra};
    ignore ->
        {ok, undefined};
    {error, Error} ->
        {error, Error};
    What ->
        {error, What}
    end.

handle_call({start_child, EArgs}, _From, State) when ?is_simple(State) ->
    #child{mfa = {M, F, A}} = hd(State#state.children),
    Args = A ++ EArgs,
    case do_start_child_i(M, F, Args) of
    {ok, Pid} ->
        NState = State#state{dynamics =
                 ?DICT:store(Pid, Args, State#state.dynamics)},
        {reply, {ok, Pid}, NState};
    {ok, Pid, Extra} ->
        NState = State#state{dynamics =
                 ?DICT:store(Pid, Args, State#state.dynamics)},
        {reply, {ok, Pid, Extra}, NState};
    What ->
        {reply, What, State}
    end;
就 是说,要M:F(A) 返回的结果是个{ok, Pid} 才会被加入到DICT里面去,
supervisor:which_children()的 时候才会出来,
而我自己的xx_work:start_link() 只是简单的返回了ok.
再看看其它 gen_server:start_link(), 都是这样写的:
start_link() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
查gen_server源码,发现它的start_link 返回就是:  {'ok', pid()} | 'ignore' | {'error', term()}

于是,我把自己的 xx_work:start_link()  返回{ok, Pid}. 搞定.

关于项目干系人

-
  • 1970年01月01日 08:00

erlang OTP supervisor 图解分析

原文链接: http://www.hoterran.info/otp-supervisor-sourcecode   supervisor实际上是基于gen_server的系统进程,监控子进程的...
  • zhangzhizhen1988
  • zhangzhizhen1988
  • 2012-09-01 16:26:21
  • 3707

Erlang supervisor重启策略

最近阅读了一下erlang的supervisor模块,自己写了一些简单的代码来区分不同重启策略的区别,这里记录一下。 首先为了能够直观的观察,我把代码写成了一个application方便用工具观察。...
  • fishe_r
  • fishe_r
  • 2015-11-21 22:58:34
  • 1388

[Erlang]supervisor的child设置为dynamic详解

原创文章,转载请注明: 转载自系统技术非业余研究本文链接地址: Erlang supervisor规格的dynamic行为分析今天benjamin同学在网上问了以下问题:我在看mochiweb和mis...
  • abv123456789
  • abv123456789
  • 2015-06-18 16:49:57
  • 1553

Erlang/OTP 监督者(Supervisor)

Erlang/OTP 监督者(Supervisor)的作用是负责其子进程的启动,停止和监视。监督者的基本思路是,保持其子进程能正常运行,并在必要时重新启动子进程。文章将从监督者配置参数和工作流程两方面...
  • cwqcwk1
  • cwqcwk1
  • 2013-10-14 20:53:17
  • 4033

处理器虚拟化技术 邓志 随书源码

  • 2015年08月25日 19:09
  • 1.73MB
  • 下载

Hello Riak

http://docs.basho.com/riak/latest/quickstart/  http://riak.com.cn/riak/latest  https://github.com/...
  • zqhxuyuan
  • zqhxuyuan
  • 2015-01-16 11:42:00
  • 1751

Erlang手册supervisor翻译

supervisor 模块 supervisor 模块概述 通用监督行为模式 描述 执行一个监督者的行为模式,一个进程监督其他被称作子进程的进程。子进程可以是另外一个监督者或者一个工作...
  • fishe_r
  • fishe_r
  • 2015-11-21 22:43:12
  • 659

erlang 的 supervisor行为

-module(myserver). -behaviour(gen_server). %%define -define(POLICY_PORT,8080). %%监听端口 -define(TCP_...
  • lile1234_show
  • lile1234_show
  • 2013-12-16 16:34:33
  • 1045

erlang四大behaviour之四-supervisor

  • 2014年04月01日 18:11
  • 5KB
  • 下载
收藏助手
不良信息举报
您举报文章:关于erlang supervisor ,书上没有讲到的细节
举报原因:
原因补充:

(最多只允许输入30个字)