在CNode社区上看到了一个问题,高并发的疑问
对自己对Node的理解有帮助,总结一下
我把代码改了一下
var http = require('http')
var fs = require('fs');
var app = http.createServer(function (req, res) {
if (req.url === '/a') {
// 斐波拉契函数
function fib(n) {
if (n === 0) return 0;
else if (n === 1) return 1;
else return fib(n - 1) + fib(n - 2)
}
setTimeout(() => {
// fs.readFile('./test.txt', 'utf8', (err, value) => {
// if (err) {
// res.end(err);
// }
// res.end(value);
// })
const a = fib(44)
res.end(JSON.stringify(a));
}, 0);
// fib(44) // 执行时间要 10s 左右
// res.end('a is ' + new Date())
} else if (req.url === '/b') {
res.end('b is ' + new Date())
}
})
app.listen(3600, function () {
console.log('服务已启动')
});
即便加上了一个异步的壳子,但是由于fib函数是CPU密集型的,在接到/b的请求后,任务被放到Node事件队列里,继续执行主线程的程序,CPU还被fib函数占着,所以不能立即处理/b请求,要等到主线程的程序执行完成之后再执行。
但是如果将fib函数换成io操作,io异步操作的时候不占用CPU,/b的请求就可以很快处理。
网友评论