Erlang 停止 gen_server

标签 erlang gen-server

我有 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 并按名称停止?

谢谢你。

最佳答案

第一:您必须始终使用相同的名称来处理进程,"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 等替代方法提供了更好的分布。

关于Erlang 停止 gen_server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5726481/

相关文章:

multithreading - GenServer上的Elixir非阻塞线程?

erlang - otp gen_server 的信息、调用、转换消息队列中是否有不同的优先级?

elixir - 在 GenServer 中保存大 map ,这是一个有效的用例吗?

erlang - 如何获得函数名称?

architecture - SOA:为什么不使用 Erlang/OTP Web 服务器作为服务?

erlang - 分布式erlang的安全性如何?

erlang - 如何获得棘手的函数引用?

erlang - 获取 gen_server/gen_fsm 状态以进行调试

erlang - 可以在Erlang消息上发送哪种类型的消息?

erlang - 如何在节点之间分发应用程序而不必在分布式握手过程中启动所有应用程序