YAWS如何处理并发用户

cgv*_*val 2 erlang yaws

我希望每次新客户端使用其Web服务器时都知道YAWS中正在执行哪些代码...

首先,我尝试了解YAWS如何处理并发用户...并查看以下.yaws页面:

io:format("~nProcess Identifier: ~p  Port: ~p  Client: ~p  YAWS pid: ~p ~n",[self(), A#arg.clisock, A#arg.client_ip_port, A#arg.pid]).
Run Code Online (Sandbox Code Playgroud)

应该返回每个客户端的Pid,端口和IP ...我在同一个浏览器(Firefox)上打开了这个页面并打开了两个不同的标签...这是打印的:

Process Identifier: <0.65.0>  Port: #Port<0.1211>  Client: {{127,0,0,1},60451}  YAWS pid: <0.65.0> 

Process Identifier: <0.65.0>  Port: #Port<0.1211>  Client: {{127,0,0,1},60451}  YAWS pid: <0.65.0> 
Run Code Online (Sandbox Code Playgroud)

由于某种原因,返回相同的端口和pid(因此,YAWS不为每个客户端创建新端口或新pid).

当我在Chrome上试用这个时,会打印出来:

Process Identifier: <0.71.0>  Port: #Port<0.2998>  Client: {{127,0,0,1},60543}  YAWS pid: <0.71.0> 

Process Identifier: <0.71.0>  Port: #Port<0.2998>  Client: {{127,0,0,1},60543}  YAWS pid: <0.71.0> 
Run Code Online (Sandbox Code Playgroud)

因此,为什么YAWS不为同一浏览器上的每个标签打开一个新端口或pid?另外,回到原来的问题,YAWS在哪里和哪个代码产生新的PID或打开一个新的端口?

谢谢

Ste*_*ski 6

除非您确定您的浏览器为每个选项卡打开了新的HTTP连接,否则您并未真正测试您认为自己正在测试的内容.相反,请从命令行尝试此操作:

curl http://yaws_host:yaws_port/path/to/your/yaws/page.yaws
curl http://yaws_host:yaws_port/path/to/your/yaws/page.yaws    
Run Code Online (Sandbox Code Playgroud)

是的,运行两次,因为保证使用两个单独的连接.然后,您将看到Yaws使用两个不同的Erlang进程和TCP连接来处理这两个请求:

Process Identifier: <0.59.0>  Port: #Port<0.1181>  Client: {{127,0,0,1},64977}  YAWS pid: <0.59.0>
Process Identifier: <0.64.0>  Port: #Port<0.3268>  Client: {{127,0,0,1},64978}  YAWS pid: <0.64.0>
Run Code Online (Sandbox Code Playgroud)

至于用于处理连接的Yaws代码所在的位置,您可以查看yaws_server.erl,特别是在acceptor/1启动进程以接受连接的do_listen/2函数和打开用于侦听的套接字的函数中.