Node.js非阻塞性质

时间:2012-10-02 10:45:33

标签: javascript node.js

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

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

sum(2,3, function(sum){
   console.log(sum);
}

仍然是同步的。要使其异步process.nextTick可以这样使用:

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

sum(2,3, function(sum){
   console.log(sum);
}

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

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