node.js - 如果阻塞操作被异步处理并导致阻塞进程队列,那么异步编程如何加快速度?
问题描述
像以前的许多人一样,我看到了这张描述 NodeJS 架构的图表,由于我是异步编程概念的新手,让我首先与您分享我对 Node 架构的(可能有缺陷的)理解。
据我所知,主要应用程序脚本首先使用 Chrome 的 V8 引擎编译成二进制代码。在此之后,它通过 Node.JS 绑定移动,这是一个允许二进制代码由事件机制处理的低级 API。然后,将单个线程分配给事件循环,该线程无限循环,不断拾取事件队列中的第一个(即最旧的)事件并分配一个工作线程来处理该事件。之后,回调存储在事件队列中,由事件循环线程移动到工作线程,并且 - 取决于回调函数是否有另一个嵌套回调函数 - 要么完成要么执行任何回调函数尚未处理的。
现在这是我不明白的。事件循环能够不断地将事件分配给工作线程,但工作线程必须处理的代码仍然是 CPU 阻塞,工作线程的数量仍然有限。在同步进程中,难道不能将不同的代码段分配给服务器 CPU 上的不同工作线程吗?
让我们举个例子:
var fs = require('fs');
fs.readFile('text.txt', function(err, data) {
if(err) {
console.log(err);
} else {
console.log(data.toString());
}
});
console.log('This will probably be finished first.');
这个例子会记录'This would likely be done first',然后再输出text.txt文件的数据,因为它是fs.readFile()函数的回调函数。现在我了解到 NodeJS 具有非阻塞架构,因为第二个代码块比第一个代码块更早完成,即使它是在稍后阶段调用的。但是,程序完成所花费的总时间仍然是每个函数完成所花费的时间之和,对吧?
我能想到的唯一答案是异步编程允许多线程,而同步编程则不允许。否则,异步事件处理实际上不会比同步编程快,对吧?
提前感谢您的回复。
解决方案
推荐阅读
- excel - VBA Listbox 列显示替代文本
- java - 未知片段 & 无法启动一个或多个类
- css - 如何在 R Shiny 中对齐图像?
- react-native - 与 webpack 一起使用时,react-navigation 无法捆绑
- html - 如何让一个 div 将文本溢出到另一个 div
- javascript - 为什么在 js 中运行两个单独的循环与单个 for 循环之间存在性能差异
- ios - Azure 推送通知未打开我的应用程序¿?
- python - 如何在 Python 中将日期时间转换为字符串?
- android - Android - 图层列表中的相对位图大小
- json - 使用 scala 将 Spark DF[string] 转换为 Json