我有一个主管。我从作为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])
吗?