【发布时间】:2021-11-18 08:55:33
【问题描述】:
正如 Joe 的书中所定义的那样,TCP 并行服务器处理这样的连接:
{ok, Listen}=gen_tcp:listen(....),
spawn(fun() ->parallel(Listen) end).
parallel(Listen) ->
{ok, Socket}=gen_tcp:accept(Listen),
spawn(fun() ->parallel(Listen) end),
doSomething(Socket).
doSomething(....) ->
....
这是逻辑,当一个监听器接受一个连接时,它会在处理这个接受的连接之前产生一个监听新传入连接的进程,这是并行规则,好的。 在代表服务器网络层的 EJABBERD 模块 ejabberd_listener.erl 中,这是我发现的:
case listen_tcp(Port, SockOpts) of
{ok, ListenSocket} ->
....
accept(ListenSocket, Module, State, Sup, Interval, Proxy),
....
accept(ListenSocket, Module,... ) ->
case gen_tcp:accept(ListenSocket) of
{ok, Socket} ->
%%%% a lot of work
....
accept(ListenSocket, Module,.... );
所以这是一个顺序监听器,它比并行运行慢,那么为什么他们不使用并行机制来提高效率和性能呢?我是 ejabberd 的新手,我可能会遗漏一些东西
【问题讨论】:
标签: erlang elixir ejabberd scalability erlang-otp