Timer erlang计时器超时

Timer erlang计时器超时,timer,erlang,gen-server,Timer,Erlang,Gen Server,我有一个带有gen_服务器的erlang模块 现在,我有: init(_Args) -> erlang:send_after(?PROCESS_STATE_INTERVAL,self(),processState), {ok, []}. 及 当我用类似于{ok,Test}=gen_server:start_link({local,challenge_manager},challenge_manager,[],[],[])的东西启动它时。几秒钟后我得到**异常错误:{tim

我有一个带有gen_服务器的erlang模块

现在,我有:

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

当我用类似于
{ok,Test}=gen_server:start_link({local,challenge_manager},challenge_manager,[],[],[])的东西启动它时。
几秒钟后我得到
**异常错误:{timeout,{gen u server,call,[,{updatevels}}


我做错什么了吗?

你不能从自身内部调用你自己的
gen_服务器。这将导致死锁(这是您看到的)。服务器进程正忙于处理您的第一个请求(因为您还没有返回),并将对第二个请求排队(这是在处理第一个请求时发出的),从而导致死锁

要解决这个问题,可以创建一个库函数,该库函数既可以使用
handle\u call
也可以使用
handle\u info
来执行异步回复(如果从
handle\u call
函数返回
{noreply,}

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