gpt4 book ai didi

erlang - 名为 timer_server 的 gen_server 导致定时器模块函数不返回

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

我创建了一个生成 gen_server 的主管我调用 timer_server .这个timer_serve的任务之一r是管理注册和调用timer:send_interval在某个时间间隔向 pid 发送消息。

然而,在 gen_server 的初始化中, 我调用 timer:send_interval我被锁定了。文档说计时器:函数立即返回,所以这很麻烦。

当我重命名我的 gen_serverrecord_timer_server这个问题解决了。我的问题是两个方面:

  • 为什么我可以创建一个注册进程timer_server , 如果已经有一个 timer:start()我的应用程序启动时调用了吗?
  • 一旦启动,如果这个函数调用我的 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 会尝试启动一个名为 timer_server 的进程,如果您先使用此名称,则会挂起。

    至于为什么它挂起 timer.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.

    返回正常,然后是对 timer_server 的 gen_server:call。然后,您的进程会卡住等待自己响应。

    关于erlang - 名为 timer_server 的 gen_server 导致定时器模块函数不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/500169/

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