小塌客

石头的博客

Category "Erlang"

在gen_server中spawn新的进程

最近Joe在erlang mail lists中频繁现身,估计是因为许多人对gen_server的使用有很多误解,忍不住出来解救众生的...

其中Joe专门解释了怎样在gen_server中管理新的进程的问题 代码:
foo(X) ->
    gen_server:call(?Mod, {foo, X}).


%% Write a gen_server handle call method like this:

handle_call({foo, X}, From, State) ->
    State1 = func1(X, State),
    State2 = func2(X, State),
    spawn_link(fun() -> do_something(State1, X, From) end),
    {noreply, State2}.

do_something(State, X, From) ->
    Reply = func3(X, State),
    gen_server:reply(From, Reply).
上面的do_something可能是一个time-cost任务,为了不阻塞当前的gen_server进程,可以spawn一个新的进程来专门处理,do_something和当前gen_server进程会并行运行,gen_server会以State2继续运行,并且不会给client返回任何消息,client一直处于等待状态(因为这里是gen_server:call), do_something在处理完毕后会负责给client答复(gen_server:reply)