Erlang:gen_server还是我自己的自定义服务器?

ErJ*_*Jab 5 erlang gen-server

我需要编写一个服务器来接收来自其他模块的指令,并根据收到的指令采取措施.效率是我的主要关注点.所以我使用gen_server或编写自己的服务器.通过"我自己的服务器"我的意思是:

-module(myserver).
-export([start/0, loop/0]).

start() ->
        spawn(myserver, loop, []).

loop() ->
   receive
        {From, Msg} -> %Do some action here... ;
        message2 -> %Do some action here...;
        message3 -> %Do some action here...;
        message4 -> %Do some action here...;
        .
        .
        .
        _-> ok
   end,
   loop().
Run Code Online (Sandbox Code Playgroud)

所以要使用myserver,我可能会在启动它时以注册名称注册该进程,然后每个客户端将使用此pid向服务器发送消息.

那么我应该使用这种方法,还是使用gen_server行为来实现服务器?使用有什么好处gen_server吗?但是gen_server,相比之下,使用会增加任何开销myserver吗?

jld*_*ont 10

我也会一起去gen_server.一旦您使用了这个设施,您将学会欣赏它的价值.函数回调可能有点尴尬(例如handle_cast对于异步调用),但最后,你会习惯它.

此外,我建议不要在没有做过一些测试的情况下进行"过早优化".您可能不希望牺牲边际效率增益的可读性/可维护性.


Zed*_*Zed 10

gen_server与自我实现的服务器相比,它的开销可以忽略不计,因为每个消息需要一些额外的函数调用(其中一个是动态的).我认为你不应该在这个实施阶段考虑这个问题.你有没有改变主意,从gen_server你自己的服务器转移到你自己的服务器应该是直截了当的.

gen_server简单循环相比,您得到的是:

  • 调试(使用sys)
  • SASL日志记录
  • 冬眠支持
  • 代码升级支持