我需要编写一个服务器来接收来自其他模块的指令,并根据收到的指令采取措施.效率是我的主要关注点.所以我使用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简单循环相比,您得到的是: