主管创建多个孩子时的问题

时间:2016-03-24 01:06:33

标签: erlang otp supervisor ets

我有一位主管。我从孩子那里得到了child_specs,这是一个gen_server。我首先为一个主管 - 儿童关系写了这个。后来我想让那位主管开始招募很多孩子。但我在子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)].

gen_server的init()函数是

init([]) ->
Config = ets:new(config, [set, named_table]),
Destinations = ets:new(destinations, [set, named_table]),

我是erlang的初学者,因此很难过。

谢谢!

2 个答案:

答案 0 :(得分:2)

你真的需要命名的ets表吗?命名表时,Erlang节点中只能存在一个以该名称表的表。摆脱named_table电话中的ets:new/2选项,您将不再获得badarg例外。

答案 1 :(得分:1)

  

私有

只有所有者进程才能读取或写入表。

你能试试ets:new(config, [set, named_table, private])吗?