Erlang停止gen_server

发布于 2024-11-02 10:04:13 字数 747 浏览 4 评论 0原文

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

谢谢。

I have gen_server:

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

Now i want to write function to stop this gen server. I have:

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

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

I run it:

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

But:

stop(player).
ok

is work.

How can i run gen_server by name and stop by name?

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

椒妓 2024-11-09 10:04:13

第一:您必须始终使用相同的名称来寻址进程,"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 这样的替代品则提供了更好的分发。

First: You must always use the same name to address a process, "foo" and foo are different, so start by having a strict naming convention.

Second: When using globally registered processes, you also need to use {global, Name} for addressing processes.

In my opinion you should also convert the stop function to use gen_server:call, which will block and let you return a value from the gen_server. An example:

stop(Name) ->
    gen_server:call({global, Name}, stop).

handle_call(stop, _From, State) ->
    {stop, normal, shutdown_ok, State}

This would return shutdown_ok to the caller.

With this said, the global module is rather limited and alternatives like gproc provides much better distribution.

冷清清 2024-11-09 10:04:13

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

I don't have the docs infront of me, but my guess would be that you need to wrap the username in a global tuple within the gen_server cast.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文