简单点说,由于nodejs是单线程。你写的代码中,上一行没执行完,下一行就不会执行的,就会造成所有请求阻塞。
举例说明:
const http = require('http')
function wait(millisec) {
var now = new Date;
while (new Date - now <= millisec) ;
}
http.createServer((req, res)=> {
if (req.url === '/') {
res.writeHead(200, {"Content-Type": 'text/html'});
res.write('home')
res.end()
}
if (req.url === '/a') {
wait(5000)
console.log('a');
res.writeHead(200, {"Content-Type": 'text/html'});
res.write('a')
res.end()
}
if (req.url === '/b') {
setTimeout(()=> {
res.writeHead(200, {"Content-Type": 'text/html'});
res.write('b')
res.end()
}, 5000)
console.log('b');
}
}).listen(8055, "127.0.0.1", function() {
console.log('server start at http://127.0.0.1:8055')
})
答案是不会。
写过JS的都知道,setTimeout的都知道,它会先执行后面的代码(console.log('b'),会先运行),等于时间到了再执行里面的代码,所以他只会阻塞当前自己这个请求,而不会对其他请求造成影响。
所以,你只需要了解,你写的哪些代码,会造成后面的所有代码都会等待,那么这段代码就会造成所有请求阻塞,这也就是 nodejs单线程会阻塞的原因。
而其他,比如PHP多线程语言,类似的代码,因为是多线程,即使一个线程被阻塞了,其他请求访问依然不会造成影响,这大概就是两者之间的区别