在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的請求就可以很快處理。