node 单线程

2019-08-05  本文已影响0人  LilyLaw

我们知道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(),因此就在这里卡死了。

上一篇 下一篇

猜你喜欢

热点阅读