【问题标题】:Node.js Non Blocking NatureNode.js 非阻塞性质
【发布时间】:2012-10-02 19:05:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我对 Node.js 也很陌生,但我认为您应该对所有操作使用异步回调。您不应该在 Node.js 服务器上进行任何同步操作。
  • 假设您的 node.js 编写了一个 html 文件 - long.html 有很多行,您这样做的方式(据我所知)是将请求路由到某个处理程序最终将不得不执行诸如: response.write (" ... 据我所知,您在某些时候无法真正逃避这样做。至少据我所知.
  • 您的处理程序要做的就是将该 HTML 返回到回调,该回调的工作是将该 html 发布到客户端,但从您的服务器代码中发布。

标签: javascript node.js


【解决方案1】:

对于同步代码和异步代码之间的界限在哪里没有明确的指导方针,更多的是应用程序流程的问题。应该首选异步操作,因为它们允许 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 操作。

无法确定请求是否花费太长时间,从而影响性能,因为限制是特定于应用程序的。这些请求是通过在应用程序上运行性能测试来定位的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 2016-07-06
相关资源
最近更新 更多