таймер эрланга получает тайм-аут - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть модуль erlang с поведением gen_server.

Теперь у меня есть:

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}]}}

Я что-то не так делаю ??

1 Ответ

10 голосов
/ 27 февраля 2012

Вы не можете назвать свой собственный gen_server изнутри себя.Это приведет к мертвой блокировке (что вы видите).Процесс сервера занят обработкой вашего первого запроса (так как вы еще не вернулись) и поставит в очередь второй запрос (который сделан из обработки первого), таким образом, мертвая блокировка.

Чтобы решить эту проблему,либо создайте библиотечную функцию, которую используют handle_call и handle_info, либо посмотрите на функцию reply/2, которая позволит вам делать асинхронные ответы (если вы возвращаете {noreply, ...} из handle_call функция).

...