gpt4 book ai didi

erlang - 为什么 simple_one_for_one 工作人员可以共享相同的子规范 ID?

转载 作者:行者123 更新时间:2023-12-01 14:12:04 25 4
gpt4 key购买 nike

我为一个名为 band_supervisor 的主管定义了 simple_one_for_one 工作规范,子规范 id 为 jam_musician :

  init([]) ->
{ok, {{simple_one_for_one, 3, 60},
[{jam_musician,
{musicians, start_link, []},
temporary, 1000, worker, [musicians]}
]}};

音乐家模块是:
-module(musicians).
-behaviour(gen_server).

-export([start_link/2, stop/1]).
-export([init/1, handle_call/3, handle_cast/2,
handle_info/2, code_change/3, terminate/2]).

-record(state, {name="", role, skill=good}).
-define(DELAY, 750).

start_link(Role, Skill) ->
gen_server:start_link({local, Role}, ?MODULE, [Role, Skill], []).

stop(Role) -> gen_server:call(Role, stop).

我可以通过以下方式创建许多 worker :
3> supervisor:start_child(band_supervisor, [drum, good]).
Musician Arnold Ramon, playing the drum entered the room
{ok,<0.696.0>}
3> supervisor:start_child(band_supervisor, [guitar, good]).
Musician Wanda Perlstein, playing the guitar entered the room
{ok,<0.698.0>}

我注意到所有工作人员都有相同的子规范 ID: jam_musician
你知道其他类型的 worker 必须有唯一的 child ID,对吧?

最佳答案

您很可能将子进程的 start_link 函数(我假设它是 gen_server)编写为:

start_link() ->
gen_server:start_link({local,Name}, ?MODULE, [], []).

这不仅调用了 init/1 函数,而且还使用原子名称注册了进程。

因此,任何在第二个时刻开始的新 child 都将尝试使用第一个 child 已经使用的名称在 erlang 节点内注册。

为了避免这种名称冲突,您应该使用以下内容:
start_link() ->
gen_server:start_link(?MODULE, [], []).

这样 child 就不会有注册名字,你也不会发生冲突。

如果您确实需要注册每个 child ,可以选择使用 gproc .

关于erlang - 为什么 simple_one_for_one 工作人员可以共享相同的子规范 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15761668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com