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



我用node.js构建了一个服务器,它使用了一些需要的var。

例如,我有server.js文件,下一个变量: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对象的限制,因为s3对象是所有请求的共同对象。

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

没有理由定义多个s3对象。因为node实际上是单线程的,你不会从中得到任何好处——每次只执行一条指令。

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

    你的代码调用s3.method
  1. s3.method在本地做一些计算,然后
  2. s3.method发送请求并等待响应(或做其他形式的输入输出)。
  3. 你的代码处理响应。

1、2和4与3相比是相对较快的操作(除非您在1、2或4中执行一些繁重的操作,但我们假设不是这种情况)。

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

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

Nodejs主(事件)循环在单个线程中运行。

这意味着你写的几乎所有代码都是一次执行一个。Nodejs'对于'慢'函数是异步的,比如(但不限于)数据库调用或其他IO操作,如文件操作。

所以一次只处理一个上传和删除请求,并且只需要一个s3对象。/

最新更新