我正在尝试测试我正在阅读的书“学习节点2012”中的一些例子。我通过执行2000个请求测试服务器的应用程序暂停。测试仪在5次请求后暂停,并在一定间隔后再发送5次。为什么暂停?我该如何解决这个问题?
服务器代码:
var http = require('http');
var fs = require('fs');
// write out numbers
var counter = 0;
function writeNumbers(res)
{
for (var i = 0; i < 100; i++)
{
counter++;
res.write(counter.toString() + '\n');
}
}
// create the http server
http.createServer( function(req, res) {
var query = require('url').parse(req.url).query;
var app = require('querystring').parse(query).file + ".txt";
// content header
res.writeHead(200, { 'Content-Type': 'text/plain' } );
// write out numbers
writeNumbers(res);
// timer to open file and read contents
setTimeout(function() {
console.log('opening ' + app);
// open and read in file contents
fs.readFile(app, 'utf8', function(err, data) {
if (err)
res.write('Could not find or open file for reading\n');
else
res.write(data);
res.end();
});
}, 2000);
}).listen(3000);
console.log('Server is running on port 3000');
垃圾邮件测试代码:
var http = require('http');
// the url we want, plus the path and options we need
var options = {
host: 'localhost',
port: 3000,
path: '/?file=secondary',
method: 'GET'
};
var processPublicTimeline = function(response) {
// finished? ok, write the data to a file
console.log('finished request');
};
for (var i = 0; i < 2000; i++)
{
// make the request, and then end it, to close the connection
http.request(options, processPublicTimeline).end();
}
答案 0 :(得分:1)
虽然这确实与Why is node.js only processing six requests at a time?
有某种关系这也是因为您使用timeOut
来调用res.end()
来关闭连接/响应,从而转移到队列中的下一个连接。
您应该异步地考虑这些类型的事物,而不使用timeOut
s,而是使用callBacks
。
所以你的两个主要块的代码可能更像是:
var counter = 0;
function writeNumbers(res, callBack){
// notice callBack argument
for (var i = 0; i < 100; i++){
counter++;
res.write(counter.toString() + '\n');
}
// execute callBack (if it exists)
if(callBack && typeof callBack === "function") callBack();
}
http.createServer( function (req, res){
var query = require('url').parse(req.url).query;
var app = require('querystring').parse(query).file + ".txt";
res.writeHead(200, { 'Content-Type': 'text/plain' } );
writeNumbers(res, function(){
// Notice this function which is passed as a callBack argument for writeNumbers to evaluate.
// This executes when the main writeNumbers portion finishes.
console.log('opening ' + app);
fs.readFile(app, 'utf8', function(err, data) {
if (err)
res.write('Could not find or open file for reading\n');
else
res.write(data);
res.end();
});
});
}).listen(3000);
请注意,您的writeNumbers
函数现在需要callBack
参数才能执行,并且当您在服务器的对象中调用它时,您传递的函数为callBack
论点。这是node.js / javascript应用程序中经常使用的核心模式之一。
这意味着您不是在等待timeOut
执行以结束您的请求响应,而是在处理您的响应时结束,并立即转移到下一个连接。这可能比2秒(你的timeOut
的数量)快得多。所以你应该看到你的连接处理得更快。
因为(正如您在评论中指出的那样)您的系统一次只能处理几个开放的TCP连接,所以您希望尽快通过您的连接。利用callBack链可以帮助您在需要按特定顺序执行操作时执行此操作,或者在执行其他操作之前需要等待某些进程完成,而无需使用timeOut
进行猜测。
希望这有帮助!