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)].

gen_server 的 init() 函数是

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

我是 erlang 的一个完整的初学者,因此很难。

谢谢 !

4

2 回答 2

2

你真的需要命名的 ets 表吗?当你命名一个表时,一个 Erlang 节点中只能存在一个同名的表。摆脱通话中的named_table选项,ets:new/2您将不再遇到badarg异常。

于 2016-03-24T03:05:45.583 回答
1

私人的

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

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

于 2016-03-24T01:18:37.640 回答