并行服务器-生成新的每个连接处理程序还是生成新的接受过程更好? (而不是循环)

时间:2018-11-17 02:58:03

标签: tcp server erlang

我正在阅读“并行世界的软件”的“使用TCP”一章,而并行TCP服务器使我感到困惑。

它不会为每个连接循环并生成一个新的处理程序进程,而是会生成一个新的 acceptor 进程,即它会不断生成其自身的副本。

%% Parallel TCP Server (From the book)

par_start(Port) ->                                                                       
    {ok, Sock} = gen_tcp:listen(Port, [{packet, line}]),                             
    spawn(fun() -> par_connect(Sock) end).

par_connect(Sock) ->
    {ok, Conn} = gen_tcp:accept(Sock),
    % Spawn a new process to accept more connections
    spawn(fun() -> par_connect(Sock) end),
    handle(Conn).

handle(Conn) ->
    receive
        {tcp, Socket, Bin} ->
            io:format("Data: ~p~n", [Bin]),
            gen_tcp:send(Socket, Bin),
            handle(Conn);
        {error, closed} ->
            io:format("Connection closed: ~p~n", [Conn])
    end.

我觉得这有点令人困惑:

par_connect(Sock) ->
    {ok, Conn} = gen_tcp:accept(Sock),
    % Spawn a new process to accept more connections
    spawn(fun() -> par_connect(Sock) end),
    handle(Conn).

在接受连接的过程中处理连接,而不是为每个连接产生新的处理程序,是否有好处?

为每个连接生成新的处理程序:

connect(Sock) ->
    {ok, Conn} = gen_tcp:accept(Sock),
    % Handle connection in different process
    Handler = spawn(fun() -> handle(Conn) end),
    gen_tcp:controlling_process(Conn, Handler),
    % Loop to accept more connections
    connect(Sock).

它确实避免了调用gen_tcp:controlling_process(..)。跳过此步骤,而是生成一个新进程是否更快?

0 个答案:

没有答案