【问题标题】:Erlang stop gen_serverErlang 停止 gen_server
【发布时间】:2011-08-09 05:57:41
【问题描述】:

我有 gen_server:

start(UserName) ->
    case gen_server:start({global, UserName}, player, [], []) of
    {ok, _} ->
        io:format("Player: " ++ UserName ++ " started");
    {error, Error} ->
        Error
    end
    ...

现在我想编写函数来停止这个 gen 服务器。我有:

stop(UserName) ->
    gen_server:cast(UserName, stop).

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

我运行它:

start("shk").
Player: shk startedok
stop(shk).
ok
start("shk").
{already_started,<0.268.0>}

但是:

stop(player).
ok

工作。

如何按名称运行 gen_server 并按名称停止?

谢谢。

【问题讨论】:

    标签: erlang gen-server


    【解决方案1】:

    首先:您必须始终使用相同的名称来处理进程,"foo"foo 是不同的,因此首先要有严格的命名约定。

    第二:使用全局注册的进程时,还需要使用{global, Name}来寻址进程。

    在我看来,您还应该将stop 函数转换为使用gen_server:call,这将阻止并让您从gen_server 返回一个值。一个例子:

    stop(Name) ->
        gen_server:call({global, Name}, stop).
    
    handle_call(stop, _From, State) ->
        {stop, normal, shutdown_ok, State}
    

    这会将shutdown_ok 返回给调用者。

    话虽如此,global 模块相当有限,gproc 等替代模块提供了更好的分发。

    【讨论】:

    【解决方案2】:

    我面前没有文档,但我猜您需要将用户名包装在 gen_server 演员表中的全局元组中。

    【讨论】:

      猜你喜欢
      • 2016-08-09
      • 2016-07-26
      • 2014-11-09
      • 2011-10-08
      • 2014-05-12
      • 1970-01-01
      • 2012-09-05
      • 2019-07-17
      • 2017-10-14
      相关资源
      最近更新 更多