我们知道node是单线程的,很多朋友对单线程似乎一知半解,即使知道单线程是啥,也不知道具体怎么表现的。
下面用一个简单的小例子,给大家演示一下node单线程在web应用中的表现,直接上代码:
const http = require('http');
let count = 0;
const server = http.createServer((request,response)=>{
response.write(`${count++}`);
response.end();
});
server.listen(3000,(error)=>{
if(error) throw error;
console.log('成功监听到3000');
});
用node执行,用浏览器访问http://localhost:3000 可以看到类似如下效果:
这种情况下是没有阻塞的,所以可以正常运行。下面我们来搞一个阻塞的情况:
const http = require('http');
let count = 0;
const server = http.createServer((request,response)=>{
response.write(`${count++}`);
while(true){}
response.end();
});
server.listen(3000,(error)=>{
if(error) throw error;
console.log('成功监听到3000');
});
再用node运行,并用浏览器访问,发现一直处于加载中的状态:
加载中
这是因为执行到while(true){}
的时候,会一直在这儿执行,不会向下走了,程序就阻塞在这儿了,所以就加载不出来。
即使我们打开另外一个窗口,还是加载不出来,而这里的while不是异步的,是同步的,因为node是单线程的,所以node无法分出一个线程去执行下面的response.end()
,因此就在这里卡死了。
网友评论