我正在尝试为我所做的流程编写主管。我已经对此进行了一段时间的调查,但无济于事,希望有人能提供帮助。
我对必须使用的接口有一定的限制,因为这是用于分配的,所以我知道使用列表的示例以及 Erlang 站点上更详细的 OTP 示例,但是这些都不合适。我提供了从我的应用程序中提取的示例来演示该问题。
我试图重新启动一个任意的工作人员,因为它没有正常的原因退出。工作进程很简单:
-module(my_mod).
-export([start/1, init/1]).
start(Pid)->
{ok, spawn_link(?MODULE, init, [Pid])}.
init(Pid) ->
register(Pid, self()),
io:format("Started ~p~n",[Pid]),
loop().
loop() ->
receive stop -> exit(byebye) end.
在主管中,我使用 ETS 选项卡来跟踪工人并重新启动他们,主管是这样的:
-module(my_sup).
-export([start_link/0, init/1, add_item/1, remove_item/1]).
start_link() ->
spawn(?MODULE, init, [self()]).
init(Pid) ->
process_flag(trap_exit, true),
register(?MODULE, Pid),
ets:new(?MODULE, [set, named_table, public]),
loop().
add_item(Pid) ->
ets:insert(?MODULE, {Pid}),
my_mod:start(Pid),
{ok, Pid}.
remove_item(Pid) ->
ets:delete(?MODULE, [Pid]).
loop() ->
io:format("Looping ~n"),
receive
{'EXIT', Pid, _Reason} ->
remove_item(Pid),
add_item(Pid)
end.
所以我相信我在这里做一些事情,my_mod 链接回主管,以便通知退出信号,主管设置了 trap_exit 以便主管有机会处理信号。但是我发现我只是得到一个 ** 异常退出:停止抛出,我不确定这是为什么?
我的测试用例如下:
1> c(my_sup), c(my_mod), my_sup:start_link().
Looping
<0.42.0>
2> my_sup:add_item(a).
Started a
{ok,a}
3> a ! stop .
** exception exit: byebye
谁能指出我正确的方向?