我正在阅读“并行世界的软件”的“使用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(..)
。跳过此步骤,而是生成一个新进程是否更快?