Multithreading 在Erlang中切换到多线程后,简单web服务器无法工作

Multithreading 在Erlang中切换到多线程后,简单web服务器无法工作,multithreading,erlang,Multithreading,Erlang,这是rudy.erl的代码: -module(rudy). -export([init/1,handler/1,request/1,reply/2, start/1, stop/0]). start(Port) -> register(rudy, spawn(fun() -> init(Port) end)). stop() -> exit(whereis(rudy), "time to die"). init(Port) -> Opt = [l

这是rudy.erl的代码:

-module(rudy).
-export([init/1,handler/1,request/1,reply/2, start/1, stop/0]).

start(Port) ->
  register(rudy, spawn(fun() ->
    init(Port) end)).

stop() ->
  exit(whereis(rudy), "time to die").

init(Port) ->
  Opt = [list, {active, false}, {reuseaddr, true}],
  case gen_tcp:listen(Port, Opt) of         % opens a listening socket
    {ok, Listen} ->
      handler(Listen),
      gen_tcp:close(Listen),            % close the socket
      ok;
    {error, _Error} -> error
  end.

handler(Listen) ->
  case gen_tcp:accept(Listen) of            % listen to the socket
    {ok, Client} ->
      request(Client),
      gen_tcp:close(Client),
      handler(Listen);
    {error, _Error} -> error
  end.

request(Client) ->
  Recv = gen_tcp:recv(Client, 0),
  case Recv of
    {ok, Str} ->
      Request = http:parse_request(Str),
%%       spawn(rudy, reply, [Client, Request]);
      reply(Client, Request);
    {error, Error} ->
      io:format("rudy: error: ~w~n", [Error])
  end.


reply(Client, {{get, URI, _}, _, _}) ->
  timer:sleep(40),
  Response = http:ok(URI),
  gen_tcp:send(Client, Response),
  gen_tcp:close(Client).
如果我执行
rudy:start(8027)
,它将通过访问正常工作,但如果我转换
回复(客户端,请求)
产卵(鲁迪,回复,[客户,请求]),无法访问前面的URL,并且没有错误输出到命令行


这里可能有什么问题?提前感谢。

这是由于争用条件造成的,在生成的进程可以回复之前,套接字会关闭。
handler/1
函数调用
request/1
,这就是
生成
发送回复的地方。一旦
spawn
启动新进程调用
reply/2
,它立即返回
request/1
,然后返回到
handler/1
,当
reply/2
在新进程中执行且仍在尝试使用套接字时,它立即关闭套接字

您只需从
handler/1
中删除
gen\u tcp:close/1
调用,因为
reply/2
函数在应答后调用它


如果您想在Erlang中看到一个小型HTTP服务器的示例,请参阅my。

另一个问题突然出现在我面前,您能看看这个吗?谢谢兄弟!