我创建了一个监督者,催生了一个 gen_server 我叫 timer_server.其中一项任务的这个 timer_server是管理登记,并呼 timer:send_interval 消息发送到一个pid在一定的时间间隔。

但是,在初始的 gen_server, ,我在那里呼叫 timer:send_interval 我得到一个锁死。该文件所述的时:功能立即返回,这是非常令人不安。

当我重新命名我 gen_serverrecord_timer_server 这个问题的澄清。我的问题是两倍则:

  1. 为什么我能创建一个注册过程 timer_server, 如果那已经被一个当 timer:start() 是由我应用程序的开始吗?
  2. 一旦开始,为什么会这样的功能不会导致badmatch找到的名字,如果它打电话到我的 timer_server 使用 send_interval 功能?

我不认为代码是必要的,但我可以更新添加一些如果提出要求。

有帮助吗?

解决方案

这可以重新创建的只是通过以下方式挂上电话来时:send_interval.

1> register(timer_server, self()).
true
2> timer:send_interval(5000, self(), hello).

虽然这种失败...

1> timer:send_interval(5000, self(), hello).
{ok,{interval,#Ref<0.0.0.32>}}
2> register(timer_server, self()).
** exited: {badarg,[{erlang,register,[timer_server,<0.30.0>]},

因此,这似乎是第一个呼吁时器试图开始一个进程称为timer_server,挂着如果你已经采取了这个名字的第一个。

为什么挂着计时器.erl:

ensure_started() ->
    case whereis(timer_server) of
        undefined -> 
            C = {timer_server, {?MODULE, start_link, []}, permanent, 1000, 
                worker, [?MODULE]}
            supervisor:start_child(kernel_safe_sup, C),  % kernel_safe_sup
            ok;
        _ -> ok
    end.

其返回收,随后通过一gen_server:呼吁timer_server.你的过程,然后被困在等待本身的作出回应。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top