スーパーバイザーがいます。gen_server である子から child_specs を取得します。私は最初に単一のスーパーバイザーと子の関係についてこれを書きました。後で私はそのスーパーバイザーに多くの子供を育ててもらいたいと思いました。しかし、私はいくつかの ets テーブルを子 gen_server の状態として持っています。したがって、スーパーバイザーが 2 番目の子を作成しようとすると、次のような例外がスローされます。
exception exit: {shutdown,
{failed_to_start_child,bench_client2,
{badarg,
[{ets,new,[config,[set,named_table]],[]},
{bench_client,init,1,
[{file,"bench_client.erl"},{line,59}]},
{gen_server,init_it,6,
[{file,"gen_server.erl"},{line,306}]},
{proc_lib,init_p_do_apply,3,
[{file,"proc_lib.erl"},{line,237}]}]}}}
ets は共有されているため、スーパーバイザーが 2 番目の子の init 関数に移動すると、すでに ets テーブルが表示されているため、例外が発生しますが、回避方法がわかりません。ただし、推測にすぎません。
これは、子の gen_server から子の仕様を取得する方法です
child_specs() ->
[begin
Name = list_to_atom(?MODULE_STRING ++ integer_to_list(Index)),
{Name, {?MODULE, start_link, [Name]},
transient, 2000, worker, [bench_client]}
end || Index <- lists:seq(1, 20)].
gen_server の init() 関数は
init([]) ->
Config = ets:new(config, [set, named_table]),
Destinations = ets:new(destinations, [set, named_table]),
私はerlangの完全な初心者なので、苦労しています。
ありがとうございました !