【发布时间】:2012-12-17 17:19:51
【问题描述】:
我有一个简单的主管配置:
-module(my_supervisor).
-behaviour(supervisor).
-export([start_link/0, init/1]).
init(_Args) ->
{ok, { {one_for_one, 5, 10},
[
{my_worker, {my_worker, start_link, []}, permanent, 5000, worker, [my_worker]}
]
}
}.
甚至是简单的工人:
-module(my_worker).
-export([start_link/0]).
start_link() ->
%??? is this the first time the supervisor is starting me or have I crashed and been restarted???
那么甚至可以确定这是主管第一次调用 start_link 函数,还是工作进程在过去某个时候崩溃并且现在正在重新启动?
【问题讨论】:
-
通常,您可以编写 my_worker 使其始终认为它是第一次启动并基于此重新创建其假设。这将使了解 my_worker 的当前启动状态变得不那么重要。如果您想对此进行计数,请在 ETS 表中的流程和监督树之外进行计数,或者通过您在重新启动时 ping 的计数过程进行。
-
我认为这只有在您使用某种副作用策略时才有可能 - ping(并增加)计数过程,增加 ets 表中的记录(如对您的 OP 的评论中所述)等等。所有这些都让我很好奇你为什么关心?通过知道某个工作器已重新启动,您想解决什么问题?
标签: erlang erlang-otp erlang-supervisor