4

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

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

我知道服务器上的所有“繁重”操作(数据库查询、文件系统搜索)都是由回调完成的,因此无法阻止 node.js 。但是,如果所有其他由服务器同步完成以处理请求的操作只需要太长时间怎么办?

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

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

4

1 回答 1

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 操作。

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

于 2012-10-02T11:05:46.330 回答