请教node非阻塞原理
发布于 6 年前 作者 andyzhang 3382 次浏览 最后一次编辑是 3 年前

各位 我发现,因为node是单线程,所以当多个人同时访问同一个页面的时候,对应的requestHander是顺序执行的,也就是说如果a的页面没有加载完,那么b的页面就不能开始加载。请教各位这个问题怎么解决。 另外,有没有关于node事件机制的文章,想了解一下node是怎样支持高并发的。

多谢

12 回复

如果a页面没有加载完成,那么此时如果CPU处于空闲状态,则b页面可以同时开始加载 这就是异步,硬盘跟CPU可以并行运行

你的意思是说,要使用那个cluster这类的module,发挥多核的优势? 如果cpu有4个,那么第5个人来了,是不是会阻塞等待第一个人加载完成呢?

多谢你的回复

因为我试验之后发现,如果page 1 的handler需要大量运算,也就是阻塞了,这时a访问page 1 ,处于等待状态,如果这时候b访问任何page,都是需要等待a完成的。

将page 1的handler单独拿到一个child process, 如果ab同时访问page 1,那么还是阻塞等,如果a访问page 1,b访问page 2,那么才能并行。

不知道各位怎么看这种情况?

@andyzhang 不用使用cluster,都会有这种效果的, 不管前一个请求有没有处理完毕,下一个请求CPU都会一口气接收下来的,这就是异步的特性了 于是,就高并发了 前提是: 不要使用这样的代码阻塞住了CPU接收请求

while(true){}

这是不是说,一旦某个page有大量高清pic要load,那么后面的人都要等待?

这个太可怕了

应该是我技术的问题吧,请各位多多指正

处理时间和加载时间是不一样的,一个是同步一个是异步

你说的是下载大图片吗,node只需要把数据流一点点扔给操作系统就算完事,不需要同步处理 所以可以同时下载多张图片

但是请求的处理时间是同步的,如果页面处理的计算时间需要2毫秒,那么并发能力就是每秒500左右

@151263 哥們兒,你真說對了,我用的是while( new Date(),getTime() < currentTime + milliSecends);這種方式來阻塞CPU的。

多謝多謝了,能否推薦一些專門介紹node事件處理機制的文章,想多了結一些:)

嗯,因為我使用while( new Date(),getTime() < currentTime + milliSecends);的方式阻塞了requestHandler,所以下一個請求只能串行執行了。

多謝你的回覆

祝好

任务队列+事件循环

够简洁,够准确:)

@151263 Thank you so much

回到顶部