从学习 Nodejs 以来,听各路大神说 nodejs 的一大优势就是处理高并发。我是非科班出身,对于高并发的理解就是能够同时处理大量请求,第一印象就是每个请求单独起个线程处理,请求与请求之间互不干扰,然鹅.......
用 http 原生代码起一个服务器,接收两个请求:
/a:该接口内部写了个斐波拉契递归函数,执行时间大约 10s 左右/b
实际起服务后,先请求 /a 接口,再请求 /b 接口。由于 /a 接口被斐波拉契函数阻塞了 10s 左右,惊讶的发现 /b 接口竟然一直要等到 /a 接口跑完才能响应。这说明 http 处理接口是一个处理完再处理下一个的,那么问题来了,10个用户同时请求同一个查询接口,假设每次查询时间为 1s,那岂不是运气差的人拿到响应肯定是在 10 秒之后。
所谓高并发又到底怎么理解呢?
var http = require('http')
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)
}
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('服务已启动')
})