Node.js非阻塞性质

我是node.js的新手,仍然试图理解它背后的哲学。 据我所知,node.js运行在一个进程中,而不是php,它为每个请求打开一个进程\线程。 尽pipe你可以说节点对于I / O来说是“非阻塞的”,但是它阻塞了请求(由于每个新请求都没有新的线程,请求堆积起来),理论上如果你写了一个node.js应用程序这不能很快处理你遇到麻烦的每一个请求。

我的问题是这样的 – 我怎么知道某个请求的处理是否需要太长的时间,以至于会阻止所有其他的请求太长而阻碍我的应用的性能呢?

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

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

节点程序员怎样才能知道他是否做了太多的事情(以一种阻塞的方式),是否经验,直觉,还是有明确的指导,如何做到这一点?

关于同步代码和asynchronous代码之间的界限是什么没有明确的指导原则,更多的是与应用程序stream程有关。 asynchronous操作应该是首选,因为它们允许Node.js主进程同时开始处理其他请求。

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

function sum(a, b, callback){ var sum = a + b; callback(sum); } sum(2,3, function(sum){ console.log(sum); } 

仍然是同步的。 为了使它asynchronousprocess.nextTick可以这样使用:

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

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

查明一个请求是否需要花太长时间,从而妨碍性能,因此不能一概而论,因为限制是针对具体应用的。 这些请求通过在应用程序上运行性能testing来定位。