2012-02-27 3 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}. 

나는 ** exception error: {timeout,{gen_server,call,[<0.329.0>,{updateLvls}]}}

내가 뭔가 잘못하고 있는가 내가 할 몇 초 후에 {ok, Test}=gen_server:start_link({local,challenge_manager},challenge_manager,[],[]). 같은 뭔가를 시작하면?

답변

10

gen_server은 자체에서 호출 할 수 없습니다. 그러면 죽은 자물쇠가 생깁니다. 서버 프로세스는 첫 번째 요청을 처리하는 중 (아직 반환하지 않았기 때문에) 처리 중이며 두 번째 요청 (첫 번째 처리로 이루어진 요청)을 대기열에 넣습니다. 따라서 데드락이 대기합니다.

는이 문제를 해결, 중 라이브러리 함수 모두 handle_callhandle_info 사용을 만들거나 (당신이 당신의 handle_call 함수에서 {noreply, ...}을 반환 할 경우) 비동기 응답을 할 수 있도록합니다 reply/2 기능을 살펴합니다.

관련 문제