首页 > nodejs是不是只能一个请求一个请求排队处理?

nodejs是不是只能一个请求一个请求排队处理?

试看一个express的Node网站,如果不开PM2或者Cluster。那么意味着只有单线程在处理Node的请求,现在有很多人一起请求,是不是这些人会排队,一个一个的处理呢?如果逻辑中间有异步代码,那么在回调之前(正在Io,是不消耗Cpu的,Node在等待之中),此时Node在干什么?不太可能在Io期间Node去处理其他请求吧?


@Joker 说的比较专业。

简单说,并不一定是服务完一个人再服务下一个的。

总有一些操作,很少(或几乎不)占用cpu时间,但是得等待硬盘/数据库去搜索资料。
这时候,我们用回调来实现异步编程,让一个句柄去做数据io,然后node就开始服务下一个人了。

回调的前提满足后,也要排队,加工数据返回数据。

楼主可以去研究一下异步的定义及其必要性。
http://baike.baidu.com/view/190230.htm


就是去处理其他请求。

Node.js的主线程是不会处于block(等待)状态的,除非使用fs.readFileSync等node api里的同步方法。

Node.js使用的是Reactor模式,凡是遇到需要block的地方,要么使用系统的异步API(网络请求),要么扔到线程池里(文件读写)去做,主线程接着处理其他请求。

简单描述Node.js主线程的工作顺序:

  1. 执行到时的Timer

  2. 检查异步操作队列里是否有已完成的,并执行回调

  3. 检查新的连接

  4. 回到1

所以多请求并发的时候,Node.js本质上是在排队,但是每个人等待的时间都很短,除非每个请求都耗费大量CPU时间。一般来说web server大多数时间都在等IO(网络请求),所以Node.js这种Reactor模式的Server对于CPU利用是相对高效的,避免了线程切换导致的的CPU上下文切换。

【热门文章】
【热门文章】