2012-02-27 41 views
0

我有一個具有行爲gen_server的erlang模塊。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}]}}

難道我做錯了什麼?

回答

10

您不能從本身內部調用您自己的gen_server。這將導致死鎖(這是你看到的)。服務器進程正在忙於處理你的第一個請求(因爲你還沒有返回),並且會對第二個請求(這是通過處理第一個請求產生的)進行排隊,從而導致死鎖。

爲了解決這個問題,可以創建一個庫功能,既handle_callhandle_info用途,或者看看在reply/2功能,這將讓你做異步回覆(如果你從你handle_call函數返回{noreply, ...})。