1

スーパーバイザーがいます。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の完全な初心者なので、苦労しています。

ありがとうございました !

4

2 に答える 2

1

プライベート

所有者プロセスのみがテーブルの読み取りまたは書き込みを行うことができます。

試してみets:new(config, [set, named_table, private])ませんか?

于 2016-03-24T01:18:37.640 に答える