Erlang gen_server с долгоиграющими задачами

Добрый день,

У меня есть gen_server процесс, который периодически выполняет некоторые длительные задачи по обновлению состояния в handle_infо] handle_info:

handle_info(trigger, State) ->
    NewState = some_long_running_task(),
    erlang:send_after(?LOOP_TIME, self(), trigger),
    {noreply, NewState}.

Но когда такая задача выполняется, то весь сервер становится неотзывчивым и любое обращение к нему приводит к падению всего сервера:

my_gen_server:status().
** exception exit: {timeout,{gen_server,call,[my_gen_server,status]}}
     in function  gen_server:call/2

Как можно избежать блокировки gen_server? И если в любой момент вызвать my_gen_server:status(), то результат должен быть примерно таким: {ok, task_active}

7
задан Dfr 10 March 2017 в 12:44
поделиться