首页 > 解决方案 > 如果阻塞操作被异步处理并导致阻塞进程队列,那么异步编程如何加快速度?

问题描述

像以前的许多人一样,我看到了这张描述 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 具有非阻塞架构,因为第二个代码块比第一个代码块更早完成,即使它是在稍后阶段调用的。但是,程序完成所花费的总时间仍然是每个函数完成所花费的时间之和,对吧?

我能想到的唯一答案是异步编程允许多线程,而同步编程则不允许。否则,异步事件处理实际上不会比同步编程快,对吧?

提前感谢您的回复。

标签: node.jsasynchronousevent-loop

解决方案


推荐阅读