簡體   English   中英

Erlang生成帶有參數的主管

[英]Erlang spawn a supervisor with a parameter

我有一個這樣創建的服務器:

gateway.erl(主管的主管)-> gateway_sup.erl(gen_servers的主管)-> gateway_serv.erl(處理每個客戶端的位置)。

正如我在互聯網上看到的那樣,這是非常基本的,大多數人都這樣做。

偵聽套接字是在gateway_sup.erl上創建的,在某些客戶端端口限制的情況下,我想偵聽多個套接字。

到目前為止,這是我的代碼。

網關

-export([start_link/0, init/1, startWithPort/1]). 

start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).

init([]) ->
    spawn_link(?MODULE, startWithPort, [8080]),
    spawn_link(?MODULE, startWithPort, [443]),
    {ok, {{simple_one_for_one, 3600, 3600},
         [{socket,
          {gateway_sup, start_link, []},
          permanent, 1000, supervisor, [gateway_sup]}
         ]}}.

startWithPort(Port) ->
    io:fwrite("Starting...: ~p~n", [Port]),
    supervisor:start_child(?MODULE, [Port]).

gateway_sup.erl

-export([start_socket/0, init/1, start_link/1]).

    start_link(Port) ->
        io:fwrite("gateway_sup start_link Port: ~p // ~p~n", [list_to_atom(atom_to_list(?MODULE) ++ atom_to_list(Port)), Port])
        supervisor:start_link({local, list_to_atom(atom_to_list(?MODULE) ++ atom_to_list(Port))}, ?MODULE, [Port]).

    init([Port]) ->
        io:fwrite("gateway_sup Init with port: ~p~n", [Port]),
        R = ssl:listen(Port, ?SSL_OPTIONS),
        {ok, LSocket} = R,
        spawn_link(fun empty_listeners/0),
        {ok, {{simple_one_for_one, 3600, 3600},
             [{socket,
               {gateway_serv, start_link, [LSocket]},
               temporary, 1000, worker, [gateway_serv]}
             ]}}.

    empty_listeners() ->
        [start_socket() || _ <- lists:seq(1,128)],
        ok.

    start_socket() ->
        supervisor:start_child(?MODULE, []).

從不調用gateway_sup.erl上的start_link()函數。 如果網關是one_for_one並且我沒有嘗試傳遞參數,則一切正常,但是我只通過一個硬編碼端口進行偵聽。

我看不到為什么它不會調用gateway_sup:start_link / 1嗎?

好,找到了! 這么小的錯誤把我帶了一個晚上!

錯誤是當我在start_link中創建角色時

list_to_atom(atom_to_list(?MODULE) ++ atom_to_list(Port))

已被替換為

list_to_atom(atom_to_list(?MODULE) ++ lists:flatten(io_lib:format("~B", [Port])))

暫無
暫無

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

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