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