【问题标题】:Should I not call gen_server:stop() directly?我不应该直接调用 gen_server:stop() 吗?
【发布时间】:2016-05-29 17:45:20
【问题描述】:

LYSE一书中作者对服务器的终止处理如下:

%% Synchronous call
close_shop(Pid) -> gen_server:call(Pid, terminate).

handle_call(terminate, _From, Cats) ->
    {stop, normal, ok, Cats}.

terminate(normal, Cats) ->
    [io:format("~p was set free.~n",[C#cat.name]) || C <- Cats],
    ok.

所以它从handle_call 回调中返回一个stop 值。

我是这样写的:

close_shop(Pid) -> gen_server:stop(Pid).

terminate(_Reason, {Cats, Money}) ->
    io:format("Made $~w~n", [Money]),
    [io:format("~p was set free.~n",[C#cat.name]) || C <- Cats].

那么直接拨打gen_server:stop()不是一个好习惯吗?

【问题讨论】:

    标签: erlang erlang-otp gen-server


    【解决方案1】:

    直接致电gen_server:stop/1,3 并不是一个坏习惯。它的作用与 LYSE 中的示例几乎相同,但没有从您的模块中调用 handle_call/3。尝试检查一下。您甚至可以阅读源代码来确定。

    【讨论】:

    • 从终止回调中返回“ok”是常见的做法吗?由于手册说“返回值被忽略。”。
    • @drozzy:你必须返回一些东西。 Atom ok 与任何其他原子一样好。它也已经存在,所以它比返回 'my extra different atom just to be funny' 或创建一些复杂的术语并将其分配到堆上要好一点。
    • @drozzy:除了引发异常、错误或退出时,不会返回任何更新的内容。在您的示例中,您返回一个 ok 原子列表。 (同lists:duplicate(length(Cats), ok).
    猜你喜欢
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2012-05-01
    • 2017-03-20
    • 2013-08-07
    • 2011-11-17
    相关资源
    最近更新 更多