Parallel Server - лучше ли создавать новый обработчик для каждого подключения или новый процесс принятия? (А не зацикливание) - PullRequest
0 голосов
/ 17 ноября 2018

Я читаю главу «Использование TCP» в «Программное обеспечение для параллельного мира», и параллельный TCP-сервер меня смущает.

Вместо того, чтобы зацикливаться и порождать новый процесс-обработчик для каждого соединения, онпорождает новый акцепторный процесс - то есть он непрерывно порождает копии самого себя.

%% 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(..),Это быстрее, чтобы пропустить это, и вместо этого порождать новый процесс?

...