Efficiency: registered process or loop-function argument?
Joe Armstrong (AL/EAB)
joe.armstrong@REDACTED
Tue Mar 28 09:25:01 CEST 2006
Difficult - I'd use method 2. I guess it really depends upon what you want to do later.
You code looks very much like http://www.sics.se/~joe/tutorials/web_server/tcp_server.erl
You might like to read http://www.sics.se/~joe/tutorials/web_server/web_server.html which has some
discussion about a web sever which spawns a new handler for every incoming socket.
/Joe
________________________________
From: owner-erlang-questions@REDACTED [mailto:owner-erlang-questions@REDACTED] On Behalf Of Jérémie Lumbroso
Sent: den 27 mars 2006 20:31
To: erlang-questions@REDACTED
Subject: Efficiency: registered process or loop-function argument?
Hello,
I have server that spawns a new 'handler' process/function for every incoming socket.
Those 'handler' process must communicate with the server process. I am wondering which of the two following solutions is best.
1. Should the server process register itself with the server atom, as in:
start() ->
[...]
register(server, spawn(test, server_loop , [LSock])).
server_loop(LSock) ->
case gen_tcp:accept(LSock, 1000) of
{ok, Socket} ->
[...]
Client_Pid = spawn(?MODULE, relay, [Socket]),
gen_tcp:controlling_process(Socket, Client_Pid),
server_loop (LSock);
[...]
end.
relay(Socket) ->
receive
{tcp, Socket, Bin} ->
Data = binary_to_list(Bin),
server ! {self(), Data},
?MODULE:relay(Socket);
[...]
end.
2. Should I pass the server's pid as an argument to the client loop, such as:
start() ->
[...]
spawn(test, server_loop, [LSock]).
server_loop(LSock) ->
case gen_tcp:accept(LSock, 1000) of
{ok, Socket} ->
[...]
Client_Pid = spawn(?MODULE, relay, [Socket, self()]),
gen_tcp:controlling_process(Socket, Client_Pid),
server_loop (LSock);
[...]
end.
relay(Socket, Server) ->
receive
{tcp, Socket, Bin} ->
Data = binary_to_list(Bin),
Server ! {self(), Data},
?MODULE:relay(Socket, Server);
[...]
end.
Or rather, I realize this question is on a per-case basis mostly ... so really, what I would like to ask, is whether there are any side-effects to doing it the second way (by passing an argument). Is the overhead for an extra argument on a loop function like that big?
Thanks,
Jérémie Lumbroso
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20060328/6ab88889/attachment.htm>
More information about the erlang-questions
mailing list