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的请求就可以很快处理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。