主管创建多个 child 时出现问题

issue when supervisor is creating more than one child

我有一个主管。我从 child 得到 child_specs,这是一个 gen_server。我首先为一位主管写这篇文章 - child 关系。后来我想让那个主管开始很多child。但是我有一些 ets tables 作为 child gen_server 中的状态。因此,当主管试图创建第二个 child 时,它会抛出一个异常,如:

     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 是共享的,当主管进入第二个 child 的 init 函数时,它已经看到一个 ets table 等等异常但不知道如何得到大约。不过,这只是一个猜测。

这就是我从 child gen_server

获取 child 规格的方式
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 的完全初学者,因此遇到了困难。

谢谢!

private

只有所有者进程可以读取或写入 table。

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

你真的需要命名 ets tables 吗?当您命名一个 table 时,Erlang 节点中只能存在一个具有该名称的 table。删除 ets:new/2 调用中的 named_table 选项,您将不会再得到 badarg 异常。