0

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

难道我做错了什么??

4

1 回答 1

10

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

要解决这个问题,要么创建一个同时使用 和 的库函数,要么handle_call查看handle_info允许reply/2您执行异步回复的函数(如果您{noreply, ...}handle_call函数返回)。

于 2012-02-27T13:28:09.457 回答