为什么';t spawn/3(MFA)在Erlang中工作?
这里是一个简单的Erlang服务器。我正在尝试使用spawn/3进行繁殖,但为了让它工作,我不得不求助于使用spawn/1为什么';t spawn/3(MFA)在Erlang中工作?,erlang,spawn,Erlang,Spawn,这里是一个简单的Erlang服务器。我正在尝试使用spawn/3进行繁殖,但为了让它工作,我不得不求助于使用spawn/1 -module(server_by_name). -export([start/0]). start() -> {ok, Listen} = gen_tcp:listen(1234, [binary, {packet, 0}, {reuseaddr, true}, {active, true}]), io:format("Server running
-module(server_by_name).
-export([start/0]).
start() ->
{ok, Listen} = gen_tcp:listen(1234, [binary, {packet, 0}, {reuseaddr, true}, {active, true}]),
io:format("Server running."),
% --> Why doesn't this work in place of the line below? --> spawn(server_by_name, connect, [Listen]).
spawn(fun() -> connect(Listen) end).
connect(Listen) ->
{ok, Socket} = gen_tcp:accept(Listen),
spawn(fun() -> connect(Listen) end),
io:format("Connection accepted on ~p Pid ~p~n", [Socket, self()]),
receive
{tcp, Socket, Bin} ->
Request = parse_request(Bin),
io:format("File requested: ~p~n", [Request]),
LoadHtml = file:read_file(Request),
case LoadHtml of
{ok, Reply} ->
Header = "HTTP/1.1 200 OK \r\n Content-Type:HTML\r\n\r\n",
ConnectCheck = gen_tcp:send(Socket, Header ++ Reply),
io:format("Connection?? ~p~n", [ConnectCheck]);
{error, Reason} ->
io:format("Error in loading html file: ~n~p~n", [Reason]);
end;
{tcp_closed, Socket} ->
io:format("Server socket closed~n")
after 5000 ->
io:format("Client unresponsive~n")
end.
parse_request(Bin) when is_binary(Bin)->
parse_request(binary_to_list(Bin));
parse_request("GET /" ++ RestStr) ->
get_request([], RestStr);
parse_request([_H|T]) ->
parse_request(T).
get_request(Request, [32|_RestStr]) ->
lists:reverse(Request);
get_request(Request, [H|RestStr]) ->
get_request([H|Request], RestStr);
get_request(Request, []) ->
io:format("Unexpected result in server_by_name:get_request()"),
list:reverse(Request).
我已经包括了所有的代码,所以你可以复制/粘贴它,并尝试自己,如果需要的话。您只需要在同一目录中提供一个文件,并按名称请求它。显然,它没有安全预防措施等。
spawn/3
要求导出该函数。您的解决方案非常合理,但也可以导出connect/1
:
-export([connect/1]). %% do not use, exported for spawn
spawn/3
要求导出该函数。您的解决方案非常合理,但也可以导出connect/1
:
-export([connect/1]). %% do not use, exported for spawn
我只是Erlang的新手,但据我所知,为了进行代码热交换,您需要使用spawn/3或spawn/4。有没有一种方法可以在不公开私有函数的情况下进行代码热交换?没有。当您使用
spawn/3
或spawn/4
或调用myu模块:函数(某物)
(与函数(某物)
相反)进行“外部”函数调用时,流程将使用新版本的模块在您的代码中。我只是Erlang的新手,但据我所知,为了进行代码热交换,您需要使用spawn/3或spawn/4。有没有一种方法可以在不公开私有函数的情况下进行代码热交换?没有。当您在代码中使用spawn/3
或spawn/4
或调用myu模块:函数(某物)
(与function(某物)
)进行“外部”函数调用时,流程将使用新版本的模块。