我或多或少是节点新手,并且在理解http.createServer
方法的请求/响应回调的异步方面时遇到一些困难。
我的理解是,当发出新请求时,匿名函数将再次为新客户端运行。
然而,在我的测试中,我发现阻止过程看起来像它会影响另一个请求客户端的响应。
我这样说是因为日志消息"A new client!"
仅在第一个请求完成后出现。
var http = require('http');
http.createServer(function(req, res){
console.log("A new client!");
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + 4000);
res.writeHead(200, {"Content-type" : "text/html"});
res.write("done");
res.end();
}).listen("8888");
我正在我的浏览器中使用多个标签对localhost:8888
进行测试。
答案 0 :(得分:1)
这与阻塞无关,但与Node.js有一个事件循环这一事实有关,这意味着它每次都有下一个时钟准备执行的事件。
这些事件are executed in order
可以有回调。上面的代码启动了一个Web服务器,该服务器具有在发出请求时运行的回调,之后在回调中显示一条消息(在控制台中)。
您可以使用以下代码检查我上面所说的内容(关于事件的顺序):
<强> server.js 强>
var counter = 0;
var http = require('http');
http.createServer(function (req, res) {
console.log(counter++);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at http://127.0.0.1:1337/');
使用Apache Benchmark工具为该服务器模拟100个并发连接,如下所示:
ab -n 100 -c 100 server.js
你会看到你会按顺序得到数字。
资源:
http://www.slideshare.net/brevoortm/nodejs-async-for-the-rest-of-us
http://code.danyork.com/2011/01/25/node-js-doctors-offices-and-fast-food-restaurants-understanding-event-driven-programming/
http://www.yuiblog.com/blog/2010/12/06/video-yuiconf2010-croucher/