node.js和require模块 - 它是如何工作的?

时间:2014-06-29 13:25:28

标签: node.js

我使用node.js构建一个使用一些require var。

的服务器

例如,我有server.js个文件,其中包含下一个var:var s3 = require('s3')

此外,server.js包含一些带回调的函数。例如:

app.post('upload', function (req, res){
   s3.upload(req.path);
}

app.post('delete', function (req, res){
   s3.delete(req.path);
}

据我所知,应用程序将异步运行请求。

我的问题是关于s3:因为我只有一个s3对象(由require定义) - 它将限制node.js的异步和并发。例如,服务器从不同的客户端获得10个请求。它可以服务所有,但它将受到所有请求共有的s3对象的限制。

这是node.js的工作原理吗?我应该定义s3个对象的集合吗?

3 个答案:

答案 0 :(得分:1)

没有理由定义多个s3对象。由于节点实际上是单线程的,因此无法从中获得任何东西 - 无论如何一次只能执行一条指令。

让我们看看如何实现一个假设的s3.method(假设这里s3指的是亚马逊s3):

  1. 您的代码调用s3.method
  2. s3.method在本地进行一些计算
  3. s3.method发送请求并等待响应(或执行其他形式的输入输出)。
  4. 您的代码处理响应。
  5. 与3相比,1,2和4是相对较快的操作(除非你在1,2或4中做了一些繁重的工作,但我们假设情况并非如此)。

    因此,当到达操作3时,节点会在等待响应时将控制权交给代码的其他部分。此等待由节点运行时和OS级事件系统处理。当响应到达时,它的处理程序排队等待执行并在控制权返回节点运行时后立即执行,并且它是队列中的第一个。

答案 1 :(得分:0)

s3没有必要等待动作完成:在node.js中,这是一种常见的方式,可以开始运行某些东西,并提供在命令完成时调用的回调。主要是它的设计是为了优化I / O操作并针对使用应用程序的低CPU进行优化。

答案 2 :(得分:0)

Nodejs main(event)循环在单个线程中运行。

这意味着您编写的几乎所有代码都会在当时执行。的NodeJS'是一个异步的慢速'函数,如(但不限于!)数据库调用或其他IO操作,如文件操作。

因此,一次只处理一个上传和删除请求,并且只需要一个s3对象./