スーパーバイザーがいます。私はgen_serverである子からchild_specsを取得します。私は最初にスーパーバイザーと子供の関係について書いた。その後、私はその監督が多くの子を始めたかった。しかし、私は子供のgen_serverの状態としていくつかのetsテーブルを持っています。スーパーバイザが複数の子を作成しているときに問題が発生する
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が共有されているので、上司が第二子の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)].
のinit()関数は
init([]) ->
Config = ets:new(config, [set, named_table]),
Destinations = ets:new(destinations, [set, named_table]),
私はErlangで完全な初心者ですので、持っているgen_server子から子仕様を取得しています方法です苦労。
ありがとうございました!
となりました。 :)ありがとう、トン@ Steve Vinoski。 – root
etsテーブルが共有されていてerlang vmに存在する場合、最初の子がetsテーブルを作成したとき、および2番目の子が新しいテーブルを作成しようとしているときに、なぜ例外がスローされないのですか?ありがとうございました! @Steve – root
私の答えに 'named_table'オプションを使用していない場合、2つの子プロセスが2つの異なるテーブルを作成しています。 'erl'を実行して' ets:new(config、[set]).'を実行すると、これを見ることができます。 2つの呼び出しから返されるテーブルIDは異なります。 –