Взаимодействие Erlang gen_server

Если у меня есть несколько экземпляров сервера, как я могу передавать информацию от одного к другому, например:

У меня есть это:

...
-record(id,{name,hash}).
-record(state, {id ,m, succ, pred}).
start(Name, M) ->
      gen_server:start_link({local, Name}, ?MODULE, {new_ring, Name, M}, []).
join_ring(Name, Other) ->
      gen_server:start_link({local, Name}, ?MODULE, {join_ring, Name, Other}, []).

...
init({new_ring, Name, M}) ->
Me=#id{name=Name,hash=M}
{ok, #state{
   id    = Me,
   m     = M,
   succ  = Me,
   pred  = nil,
  }};
init({join_ring, Name, Other}) ->
Me=#id{name=Name,hash=M}
{ok, #state{
   id    = Me,
   m     = Other,
   succ  = Me,
   pred  = nil,
  }}.

Допустим, у меня есть два сервера, один и два. Как я могу получить доступ с сервера к одной информации из состояния второго сервера?


person Rebeca SO    schedule 16.09.2014    source источник


Ответы (1)


-module(wy).
-compile(export_all).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
-behaviour(gen_server).
-record(state, {id ,m, succ, pred}).

start(Name, M) ->
    gen_server:start_link({local, Name}, ?MODULE, [Name, M], []).

init([Name, M]) ->
    {ok, #state{id = Name, m = M}}.

handle_call({get_server_info}, _Frome, State) ->
    {reply, State, State};
handle_call(_Request, _From, State) ->
    Reply = ok,
    {reply, Reply, State}.

handle_cast(_Msg, State) ->
    {noreply, State}.

handle_info(_Info, State) ->
    {noreply, State}.

terminate(_Reason, _State) ->
    ok.

code_change(_OldVsn, State, _Extra) ->
    {ok, State}.


get_server_info(ServerName) ->
    gen_server:call(ServerName, {get_server_info}).

Я думаю, вы можете сослаться на этот образец кода. Вы можете дать серверу имя, например server1 & server2. Затем вы используете gen_server:call/2 для отправки сообщения на нужный сервер.

просто запустите два gen_serber:

   4> wy:start(server1, server1).
    {ok,<0.50.0>}
    5> wy:start(server2, server2).
    {ok,<0.52.0>}

Чтобы получить информацию о состоянии с сервера:

24> wy:get_server_info(server2).
{state,server2,server2,undefined,undefined}
25> wy:get_server_info(server1).
{state,server1,server1,undefined,undefined}
person BlackMamba    schedule 16.09.2014
comment
Спасибо!! Это очень помогает. Еще один вопрос, это способ узнать имя всех работающих серверов?? Я впервые с таким языком :( - person Rebeca SO; 16.09.2014
comment
Вы можете использовать erlang:registered() для вывода списка всех зарегистрированных pid.erlang.org/doc /man/erlang.html#registered-0 - person BlackMamba; 16.09.2014