【问题标题】:erlang timer gets timeouterlang计时器超时
【发布时间】:2012-03-16 22:50:23
【问题描述】:

我有一个带有行为 gen_server 的 erlang 模块。

现在,我有:

init(_Args) ->
    erlang:send_after(?PROCESS_STATE_INTERVAL,self(),processState),
    {ok, []}.

handle_info(processState, _State)->
    {ok, NewState} = gen_server:call(self(), {updateLvls}), %works fine, tested
    timer:send_after(?PROCESS_STATE_INTERVAL,self(),processState),
    {noreply, NewState}.

几秒钟后,当我以{ok, Test}=gen_server:start_link({local,challenge_manager},challenge_manager,[],[]). 之类的内容开始它时,我得到** exception error: {timeout,{gen_server,call,[<0.329.0>,{updateLvls}]}}

我是不是做错了什么?

【问题讨论】:

    标签: timer erlang gen-server


    【解决方案1】:

    您不能从自身内部调用自己的gen_server。这将导致死锁(这就是您所看到的)。服务器进程正忙于处理您的第一个请求(因为您还没有返回)并将第二个请求(由第一个请求的处理产生)排队,因此死锁。

    要解决这个问题,要么创建一个库函数供 handle_callhandle_info 使用,要么查看 reply/2 函数,它可以让你进行异步回复(如果你从 @ 返回 {noreply, ...} 987654327@函数)。

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 1970-01-01
      • 2018-02-13
      • 2014-05-12
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多