试看一个express的Node网站,如果不开PM2或者Cluster。那么意味着只有单线程在处理Node的请求,现在有很多人一起请求,是不是这些人会排队,一个一个的处理呢?如果逻辑中间有异步代码,那么在回调之前(正在Io,是不消耗Cpu的,Node在等待之中),此时Node在干什么?不太可能在Io期间Node去处理其他请求吧?
1 回答
神不在的星期二
TA贡献1963条经验 获得超6个赞
就是去处理其他请求。
Node.js的主线程是不会处于block(等待)状态的,除非使用fs.readFileSync等node api里的同步方法。
Node.js使用的是Reactor模式,凡是遇到需要block的地方,要么使用系统的异步API(网络请求),要么扔到线程池里(文件读写)去做,主线程接着处理其他请求。
简单描述Node.js主线程的工作顺序:
执行到时的Timer
检查异步操作队列里是否有已完成的,并执行回调
检查新的连接
回到1
所以多请求并发的时候,Node.js本质上是在排队,但是每个人等待的时间都很短,除非每个请求都耗费大量CPU时间。一般来说web server大多数时间都在等IO(网络请求),所以Node.js这种Reactor模式的Server对于CPU利用是相对高效的,避免了线程切换导致的的CPU上下文切换。
添加回答
举报
0/150
提交
取消