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



我有一个主管。我从作为gen_server的child获取child_specs。我第一次写这篇文章是为了一个单独的主管-孩子关系。后来我想让那个主管生很多孩子。但是我在子gen_server中有一些ets表作为state。因此,当主管试图创建第二个孩子时,它抛出了一个异常,比如:

     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表,因此出现了异常,但不确定如何处理。不过这只是猜测。

这就是我从子代服务器获取子代规范的方式

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

我完全是二郎的初学者,所以过得很艰难。

谢谢!

您真的需要命名的ets表吗?命名表时,在Erlang节点中只能存在一个同名表。去掉ets:new/2调用中的named_table选项,就不会再出现badarg异常。

私人

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

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

相关内容

  • 没有找到相关文章

最新更新