阻止http请求/响应回调?

时间:2011-12-18 16:32:17

标签: javascript node.js asynchronous blocking

我或多或少是节点新手,并且在理解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进行测试。

1 个答案:

答案 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/