Node.js非阻塞性质

Joe*_*lum 4 javascript node.js

我是node.js的新手,仍在努力理解它背后的哲学.据我所知,node.js只在一个进程中运行,而不是php,它为每个请求打开一个进程\线程.虽然你可以说Node对于i/o来说是"非阻塞的",但它阻止了请求(由于每个新请求没有新线程,所以请求堆积起来)理论上如果你编写了一个node.js应用程序这对你遇到麻烦的每个请求都没有快速处理.

我的问题是 - 如何判断某个请求的处理时间是否过长,以至于它会阻止所有其他请求太长时间并阻碍我的应用程序的性能?

我知道服务器上的所有"重"动作(db查询,文件系统搜索)都是通过回调完成的,因此不能阻塞节点.但是,如果服务器同步完成的所有其他操作处理请求只需要太长时间呢?

例如,服务器需要在响应中写入大量的html.那么会发生什么?

节点程序员如何知道他是否对某个请求(以阻塞方式)做得太多,是经验,直觉还是有关于如何做到这一点的明确指南?

Dea*_*ady 5

关于同步代码和异步代码之间的限制在哪里没有明确的指导,它更多地与应用程序流有关.异步操作应该是首选,因为它们允许Node.js主进程在此期间开始处理其他请求.

也就是说,简单地为每个函数使用回调并不是一个解决方案,因为一段代码就是这样的:

function sum(a, b, callback){
   var sum = a + b;
   callback(sum);
}

sum(2,3, function(sum){
   console.log(sum);
}
Run Code Online (Sandbox Code Playgroud)

仍然是同步的.为了使它成为异步process.nextTick可以这样使用:

function sum(a, b, callback){
   var sum = a + b;
   process.nextTick(function(){
     callback(sum);
   });
}

sum(2,3, function(sum){
   console.log(sum);
}
Run Code Online (Sandbox Code Playgroud)

一般的经验法则是避免同步递归计算,重循环和IO操作.

找出请求是否花费太长时间因此会妨碍性能无法定义,因为限制是特定于应用程序的.通过对应用程序运行性能测试来定位这些请求.