supervisor start_child 注意


一.有一个supervisor Module:
-behaviour(supervisor).
 
%% API
-compile(export_all).
 
%% Supervisor callbacks
-export([init/1]).
 
-define(SERVER, ?MODULE).
 
start_link() ->
    supervisor:start_link({local, ?SERVER}, ?MODULE, []).
 
 
%% 启动子节点方法,到本supervisor下
%% Mod:要启动的模块, Args:启动参数
%% 返回值:ok
start_child_worker(Mod, Args) ->
    {ok, Pid} = supervisor:start_child(?MODULE,
                                     {Mod, {Mod, start_link, Args},
                                      transient, 8000, worker, [Mod]}),
    {ok, Pid}.
 
%% 启动子节点方法,到本supervisor下
%% Mod:要启动的模块, Args:启动参数
%% 返回值:ok
start_child_sup(Mod, Args) ->
    {ok, Pid} = supervisor:start_child(?MODULE,
                                     {Mod, {Mod, start_link, Args},
                                      transient, infinity, supervisor, [Mod]}),
    {ok, Pid}.
 
init([]) ->
    RestartStrategy = one_for_one,
    MaxRestarts = 1000,
    MaxSecondsBetweenRestarts = 3600,
 
    SupFlags = {RestartStrategy, MaxRestarts, MaxSecondsBetweenRestarts},
 
 
 
    {ok, {SupFlags, []}}.
 
 
二.在启动模块中写如下方法
        {ok, Pid1} = e_test_sup_root:start_child_worker(e_test_server1, []),
        {ok, Pid2} = e_test_sup_root:start_child_worker(e_test_server2, [])
        这样是正常的
 
三.如果第二句放到e_test_server1的init方法中去,
    相当于第一次调用还没有返回的基础上又执行第二次调用,
    虽然不会导致cpu飙高,但是实际上产生了真正的死循环,init方法不会返回
 

posted on 2012-08-16 16:02  fangjie008  阅读(598)  评论(0编辑  收藏  举报

导航