erlang计时器超时

Dan*_*iel 0 erlang timer gen-server

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

我现在有:

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

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

当我开始使用类似的东西{ok, Test}=gen_server:start_link({local,challenge_manager},challenge_manager,[],[]).后,我得到了** exception error: {timeout,{gen_server,call,[<0.329.0>,{updateLvls}]}}

难道我做错了什么??

Ada*_*erg 10

你不能gen_server从内部打电话给自己.这将导致死锁(这是你所看到的).服务器进程忙着处理你的第一个请求(因为你还没有返回),并将第二个请求排队(这是从处理第一个请求),因此死锁.

要解决这个问题,要么创建一个既可以使用handle_call又可以handle_info使用的库函数,或者查看reply/2将允许您进行异步回复{noreply, ...}handle_call函数(如果从函数返回).