我有一个带行为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}]}}
我做错了吗?
答案 0 :(得分:10)
您无法从内部调用自己的gen_server
。这将导致死锁(这是你所看到的)。服务器进程忙于处理你的第一个请求(因为你还没有返回),并将第二个请求排队(这是从处理第一个请求开始),因此死锁。
要解决此问题,请创建handle_call
和handle_info
使用的库函数,或者查看reply/2
函数,它将允许您执行异步回复(如果您返回来自{noreply, ...}
函数的handle_call
。