我使用以下代码来测试请求处理
app.get('/', function(req, res) {
console.log('time', MOMENT());
setTimeout( function() {
console.log(data, ' ', MOMENT());
res.send(data);
data = 'changing';
}, 50000);
var data = 'change first';
console.log(data);
});
由于这个请求不需要太多的处理时间,除了 50 秒的 setTimeout 和所有超时都像往常一样一起处理。
响应 3 一起请求-
time moment("2017-05-22T16:47:28.893")
change first
time moment("2017-05-22T16:47:30.981")
change first
time moment("2017-05-22T16:47:33.463")
change first
change first moment("2017-05-22T16:48:18.923")
change first moment("2017-05-22T16:48:20.988")
change first moment("2017-05-22T16:48:23.466")
在此之后,我进入第二阶段......即,如果我的请求需要花费大量时间来处理同步文件或其他需要时间的事情怎么办。
app.get('/second', function(req, res) {
console.log(data);
if(req.headers.data === '9') {
res.status(200);
res.send('response from api');
} else {
console.log(MOMENT());
for(i = 0; i<9999999999; i++){}
console.log('Second MOMENT', MOMENT());
res.status(400);
res.send('wrong data');
}
var data = 'second test';
});
由于我的第一个请求仍在处理中,所以我的第二个请求没有被 Node.js 接受。因此,我得到了 2 个请求的以下响应-
undefined
moment("2017-05-22T17:43:59.159")
Second MOMENT moment("2017-05-22T17:44:40.609")
undefined
moment("2017-05-22T17:44:40.614")
Second MOMENT moment("2017-05-22T17:45:24.643")
因此,对于所有异步函数,Node 中都有一个虚拟线程,并且 Node 在完成之前的请求之前会接受其他请求异步工作(如 fs、mysql 或调用 API),但是它将自身保持为单线程,并且直到所有请求都不会处理其他请求前面的都完成了。