2016-03-24 5 views
1

スーパーバイザーがいます。私は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子から子仕様を取得しています方法です苦労。

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

答えて

2

本当に名前のついたテーブルが必要ですか?テーブルに名前を付けると、Erlangノード内にその名前のテーブルが1つしか存在できません。 ets:new/2コールでnamed_tableオプションを取り除くと、もうbadarg例外は発生しません。

+0

となりました。 :)ありがとう、トン@ Steve Vinoski。 – root

+0

etsテーブルが共有されていてerlang vmに存在する場合、最初の子がetsテーブルを作成したとき、および2番目の子が新しいテーブルを作成しようとしているときに、なぜ例外がスローされないのですか?ありがとうございました! @Steve – root

+0

私の答えに 'named_table'オプションを使用していない場合、2つの子プロセスが2つの異なるテーブルを作成しています。 'erl'を実行して' ets:new(config、[set]).'を実行すると、これを見ることができます。 2つの呼び出しから返されるテーブルIDは異なります。 –

1

プライベート

所有者だけプロセスが読み取りまたはテーブルに書き込むことができます。

ets:new(config, [set, named_table, private])よろしいですか?

+0

いいえ。試しましたが同じエラーです。また、好奇心から、もしそれがプライベートなら、他の子供たちはどのようにテーブルにアクセスできますか?でもありがとう! – root

関連する問題