簡體   English   中英

Erlang主管樹終止

[英]Erlang supervisor tree terminating

我正在嘗試構建一個具有以下結構的主管樹:

1個root主管-> 3個“級別”主管->每個級別主管都有一個初始值設定主管-> X個工人(示例中,現在只有1個)

但是出於某種原因,啟動第二級主管會使整個樹終止,如果我只啟動1個root-> 1級-> 1 init-> 1個worker(或更多worker),那很好,但是只要我嘗試添加更多監督者樹終止。

-module(otp_supervisor).
-behavior(supervisor).

-export([start_cell/1]).
-export([init/1]).

start_cell(root) ->
    supervisor:start_link({local, root}, ?MODULE, [root]);
start_cell({Type, Role}) ->
    supervisor:start_link({local, Type}, ?MODULE, [{Type, Role}]).

init([root]) -> 
    init_root(one_for_one, 3, 60);
init([{level, Param}]) -> 
    init_level(one_for_one, 3, 60, {member, Param});
init([{member, Param}]) -> 
    init_member(one_for_one, 3, 60, Param).

init_root(RestartStrategy, MaxRestart, MaxTime) ->
    io:format("~p ~s: Spawning...~n", [self(), root_supervisor]),
    {ok, {
        {RestartStrategy, MaxRestart, MaxTime},
        [
            {olevel,
                {otp_supervisor, start_cell, [{level, overseer}]},
                permanent, 1000, supervisor, [otp_supervisor]
            },
            {slevel,
                {otp_supervisor, start_cell, [{level, supervisor}]},
              permanent, 1000, supervisor, [otp_supervisor]
            },
            {wlevel,
                {otp_supervisor, start_cell, [{level, worker}]},
                permanent, 1000, supervisor, [otp_supervisor]
            }
        ]
        }
    }.

init_level(RestartStrategy, MaxRestart, MaxTime, {member, overseer}) ->
    io:format("~p ~s: Spawning...~n", [self(), overseer_level_supervisor]),
    {ok, {
        {RestartStrategy, MaxRestart, MaxTime},
        [
            {oinit,
                {otp_supervisor, start_cell, [{member, overseer}]},
                permanent, 1000, supervisor, [otp_supervisor]}
        ]
        }
    };
init_level(RestartStrategy, MaxRestart, MaxTime, {member, supervisor}) ->
    io:format("~p ~s: Spawning...~n", [self(), supervisor_level_supervisor]),
    {ok, {
        {RestartStrategy, MaxRestart, MaxTime},
        [
            {sinit,
                {otp_supervisor, start_cell, [{member, supervisor}]},
                permanent, 1000, supervisor, [otp_supervisor]}
        ]
        }
    };
init_level(RestartStrategy, MaxRestart, MaxTime, {member, worker}) ->
    io:format("~p ~s: Spawning...~n", [self(), worker_level_supervisor]),
    {ok, {
        {RestartStrategy, MaxRestart, MaxTime},
        [
            {winit,
                {otp_supervisor, start_cell, [{member, worker}]},
                permanent, 1000, supervisor, [otp_supervisor]}
        ]
        }
    }.

init_member(RestartStrategy, MaxRestart, MaxTime, overseer) ->
    io:format("~p ~s: Spawning...~n", [self(), init_overseer]),
    {ok, {
        {RestartStrategy, MaxRestart, MaxTime},
        [
            {ol_core,
                {aux_datasocket, start, [ol_overseer1]},
                permanent, 1000, worker, [aux_datasocket]
            }
        ]
        }
    };
init_member(RestartStrategy, MaxRestart, MaxTime, supervisor) ->
    io:format("~p ~s: Spawning...~n", [self(), init_supervisor]),
    {ok, {
        {RestartStrategy, MaxRestart, MaxTime},
        [
            {sl_core,
                {aux_datasocket, start, [sl_overseer1]},
                permanent, 1000, worker, [aux_datasocket]
            }
        ]
        }
    };
init_member(RestartStrategy, MaxRestart, MaxTime, worker) ->
    io:format("~p ~s: Spawning...~n", [self(), init_worker]),
    {ok, {
        {RestartStrategy, MaxRestart, MaxTime},
        [
            {wl_core,
                {aux_datasocket, start, [wl_overseer1]},
                permanent, 1000, worker, [aux_datasocket]
            }
        ]
        }
    }.

aux_datasocket模塊是一個非常簡單的gen_server,它本身可以很好地工作(因為除了現在啟動gen_server以外,它什么都不做),所以我很肯定錯誤不在該模塊中。

猜猜:您正在使用{local, Type}注冊點對同一主管進行多次注冊。 調試此問題的方法是運行rel -boot start_sasl ,然后查找崩潰/進度報告,並嘗試找出問題所在。 多重性問題表明這是錯誤的。

另一個重要的事情是,從外殼程序運行此命令會將樹鏈接到外殼程序。 因此,如果最終由於錯誤而殺死了shell,poof也將成為主管樹。 您需要將其移出鏈接網絡:

Pid = spawn(fun() -> {ok, _} = supervisor_tree_start(), receive stop -> ok end end),
...
Pid ! stop.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM