Nodejs高并發的疑問

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。