Добрый день,
У меня есть 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}