У меня есть gen_server, показанный ниже. Это работает по большей части. Однако, когда я запускаю его из оболочки, ответы возвращаются прямо в приглашение оболочки. Я бы ожидал, что они будут отправлены в виде сообщений обратно в pid оболочки, а затем я бы использовал flush(), чтобы увидеть их.
Что мне нужно изменить, чтобы foo_worker отправлял свои ответы в виде сообщений?
-module(foo_worker).
-behaviour(gen_server).
%% API
-export([start_link/1, start/1, init/1, send/3, die/1]).
-export([handle_call/3, handle_cast/2, handle_info/2, terminate/2]).
%%%-------------------------------------------------------------------
send(Worker, Ref, Counter) ->
gen_server:call(Worker, {inc, Ref, Counter}).
die(Worker) ->
gen_server:cast(Worker, die).
%%%-------------------------------------------------------------------
start_link(Limit) ->
gen_server:start_link(?MODULE, [Limit], []).
start(Limit) ->
gen_server:start(?MODULE, [Limit], []).
init([Limit]) ->
{ok, Limit}.
handle_call(_, _, Limit) when Limit =< 0 ->
exit({worker, eol});
handle_call({inc, Ref, Data}, From, Limit) ->
io:format("From ~p~n", [From]),
{reply, {Ref, updated, Data+1}, Limit - 1}.
handle_cast(die, _) ->
io:format("~p Dying ~n",[self()]),
exit(normal).
handle_info(Info, State) ->
io:format("Unkown message ~p for state ~p~n", [Info, State]).
terminate(Reason, State) ->
io:format("~p Died because ~p with state ~p~n", [self(), Reason, State]).
gen_server:handle_info/2
обрабатывает прием обычных сообщений. Вы можете отправлять сообщения из него или из одной из другихgen_server
функций обратного вызова. 24.05.2015