モジュール/関数mymoduleがあり、スーパーバイザーの動作の下で複数回起動する方法は?
たとえば、同じプロセス(mymodule) の 2 つのインスタンスを同時に開始する必要があります。子識別子をchild1およびchild2と呼びました。どちらも、開始したいmymoduleモジュールを指しています。ワーカー プロセス「mymodule」の各インスタンスを開始する 2 つの異なる関数を指定しました ( start_link1 および start_link2 )。
-module(my_supervisor).
-behaviour(supervisor).
-export([start_link/0, init/1]).
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, _Arg = []).
init([]) ->
{ok, {{one_for_one, 10, 10},
[{child1,
{mymodule, start_link1, []},
permanent,
10000,
worker,
[mymodule]}
,
{child2,
{mymodule, start_link2, []},
permanent,
10000,
worker,
[mymodule]}
]}}.
ワーカーには、テスト目的で 2 つの異なる start_link 関数 ( start_link1 および start_link2 ) があります。
-module(mymodule).
-behaviour(gen_server).
start_link1() ->
log_something("at link 1"),
gen_server:start_link({global, child1}, ?MODULE, [], []).
start_link2() ->
log_something("at link 2"),
gen_server:start_link({global, child2}, ?MODULE, [], []).
init([]) ->
....
上記で、ログに「リンク 1 で」というメッセージが表示されますが、「リンク 2 で」というメッセージがどこにでも表示されます。また、 link1 のインスタンスでは何も実行しません。明らかに死ぬだけです。
機能する唯一のシナリオは、名前「child1」がワーカー モジュール名「mymodule 」と一致する場合です。