Timer erlang计时器超时
我有一个带有gen_服务器的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
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}.