gen_server partial replies
Mikael Karlsson
mikael.karlsson@REDACTED
Sat Nov 22 14:59:39 CET 2003
fredag 21 november 2003 17:29 skrev Bengt Kleberg:
>
> why do you want to do a partial reply? if it is to free up the server
> for other call's, then you could
> 1 spawn a new process
> 2 return {noreply, State};
> 3 use gen_server:reply(Pid, Reply), from the spawned process, when ready
> to do so
>
>
> bengt
Great info, I did not know this!
I can see from the gen_server code that this works for handle_call/3 were you
have a choice of returning {reply, Reply, NState} or {noreply, NState}.
In the system documentation:
http://www.erlang.org/doc/r9c/doc/design_principles/part_frame.html
this is not obvious to me though, as I can only see the asynchronous
handle_cast mentioned for {noreply, NState}.
I think this is a common pattern in many situations were you want to have a
choice of returning at once or later. If I have a (proxy) cache I want to
return at once at hits, but later if I have to go and ask a remote system for
information.
One thing in the gen_server code bothers me a bit though. There is the main
loop function which calls the handle_msg function which calls the loop
function and so on. Is this OK for an infinite process? Will the compiler
handle the stack properly?
loop(Parent, Name, State, Mod, Time, Debug) -> ...
handle_msg(Msg, Parent, Name, State, Mod, Time);
handle_msg({'$gen_call', From, Msg}, Parent, Name, State, Mod, _Time) ->
case catch Mod:handle_call(Msg, From, State) of
{reply, Reply, NState} ->
reply(From, Reply),
loop(Parent, Name, NState, Mod, infinity, []);
...
Mikael
More information about the erlang-questions
mailing list