Good day,
I have a gen_server
process which does some long-running state-updating tasks periodically in
handle_info
:
handle_info(trigger, State) ->
NewState = some_long_running_task(),
erlang:send_after(?LOOP_TIME, self(), trigger),
{noreply, NewState}.
But when such task runs, then whole server gets unresponsive and any call to it leads to whole server crash:
my_gen_server:status().
** exception exit: {timeout,{gen_server,call,[my_gen_server,status]}}
in function gen_server:call/2
How it is possible to avoid blocking of gen_server ?
And when one call my_gen_server:status()
at any time, the result should be something like:
{ok, task_active}
{ok, task_active}
), but the code finally getting harder to read and understand – Unravel