erlang计时器超时

时间:2012-02-27 13:01:37

标签: timer erlang gen-server

我有一个带行为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}]}}

我做错了吗?

1 个答案:

答案 0 :(得分:10)

您无法从内部调用自己的gen_server。这将导致死锁(这是你所看到的)。服务器进程忙于处理你的第一个请求(因为你还没有返回),并将第二个请求排队(这是从处理第一个请求开始),因此死锁。

要解决此问题,请创建handle_callhandle_info使用的库函数,或者查看reply/2函数,它将允许您执行异步回复(如果您返回来自{noreply, ...}函数的handle_call