Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
node.js是否限制并发回调的数量?_Node.js - Fatal编程技术网

node.js是否限制并发回调的数量?

node.js是否限制并发回调的数量?,node.js,Node.js,我是Node.js新手,最近一直在研究回调和承诺。假设我有一系列的承诺(我举了一个例子): fs.readFile('test.txt') .then(功能(数据){ 返回db.insert({ 文件名:“test.txt”, 文件内容:数据 }); }) .然后(功能(文档){ 返回smtp.send({ 致:'test@test.com', 主题:“测试”, 正文:“这是一封关于“+document.fileName+”的通知电子邮件。” }); }) .然后(函数(){ 日志(“发送成功电

我是Node.js新手,最近一直在研究回调和承诺。假设我有一系列的承诺(我举了一个例子):

fs.readFile('test.txt')
.then(功能(数据){
返回db.insert({
文件名:“test.txt”,
文件内容:数据
});
})
.然后(功能(文档){
返回smtp.send({
致:'test@test.com',
主题:“测试”,
正文:“这是一封关于“+document.fileName+”的通知电子邮件。”
});
})
.然后(函数(){
日志(“发送成功电子邮件”);
},函数(err){
控制台错误(err);
});
//更多代码在这里。。。
所有这些都将在一个线程中运行。但是如果在
这里有更多的代码
之后,我用回调/承诺调用另一个函数,据我所知,这将在第二个线程上运行


一个普通的系统只有几个线程,比如2、4或8。如果我一个接一个地放置几个带有回调的函数,理论上节点将使用那么多线程。但Node是否将其使用的线程数限制为机器拥有的线程数,从而不会挂起操作系统?我是否应该关心在我的文件中是否有几个函数/回调函数像这样相互连接?

否,node.js是单线程的(除非您使用
工作线程,但情况完全不同)。为了实现类似于并发的功能,node.js使用。基本上,当有东西在等待时,它返回到事件循环,事件循环将看到还有什么事情要做(处理事件)。要做的另一件事可能是继续执行先前等待的另一段代码

你可以想象它就像做一顿复杂的饭,你同时做很多事情。这实际上是一个事件循环。你在关注某件事,当你立即关注它时,你在检查这段时间发生了什么,是否还有其他事情需要做出反应,如果有,你就这样做,以此类推,直到最终一切都完成。你的炉子上有好几样东西同时烹饪,当其中一件需要注意时,你就把它给了它,但你仍然只使用一个厨师(线)。(顺便说一下,这也说明了为什么你不应该通过一个长时间同步运行的事情来阻止事件循环——想象一下在烹饪过程中接到一个电话,分心5分钟,也就是说不处理事件……只发现后来燃烧的东西)

因为这里根本不涉及线程,所以对于等待的内容数量也没有限制。(唯一的限制是RAM。)

另外,请注意您所写的关于线程有限的系统的内容:您所写的方式并非如此,您似乎将硬件线程与软件线程混淆了。您可能指的是处理器线程,它是硬件支持的虚拟CPU核心。这是您编写的代码下面的几个抽象层。软件线程是一个不同的概念,由操作系统管理。一个进程可以有比硬件中更多的线程,但它们的实际并发性将受到限制。因此,例如,如果您有100个线程,而您的处理器提供4个线程,那么并行运行的线程就不会超过4个(通常会更少,因为系统中会发生其他事情)。它们开始运行的时间由操作系统的调度程序管理,确保每个(软件)线程获得可用处理器电源的“公平份额”,每几微秒切换一次,因此感觉好像所有100个线程都在并行运行