YAWS如何处理并发用户

时间:2013-04-19 11:23:55

标签: 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]).

应该返回每个客户端的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> 

由于某种原因,返回了相同的端口和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> 

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

由于

1 个答案:

答案 0 :(得分: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    

是的,运行两次,因为保证使用两个单独的连接。然后,您将看到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>

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