【问题标题】:Erlang gen_server communicationErlang gen_server 通信
【发布时间】:2014-11-09 15:22:17
【问题描述】:

如果我有多个服务器实例,如何将信息从一个实例传递到另一个实例,例如:

我有这个:

...
-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,
  }}.

假设我有两台服务器,一台和两台。如何从服务器二的状态访问服务器一的信息?

【问题讨论】:

    标签: erlang gen-server


    【解决方案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}
    

    【讨论】:

    • 谢谢!!这很有帮助。还有一个问题,这是一种找出所有正在运行的服务器名称的方法?这是我第一次使用这种语言:(
    • 您可以使用erlang:registered()列出所有已注册的pid。erlang.org/doc/man/erlang.html#registered-0
    猜你喜欢
    • 2011-08-09
    • 2011-10-08
    • 2016-08-09
    • 2011-08-17
    • 2014-05-12
    • 1970-01-01
    • 2012-09-05
    • 2013-04-12
    • 2019-01-23
    相关资源
    最近更新 更多