问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何发挥NodeJS单线程异步非阻塞I/O性能优势

发布网友 发布时间:2022-04-21 08:45

我来回答

1个回答

热心网友 时间:2022-04-22 12:02

阻塞I/O
程序执行过程中必然要进行很多I/O操作,读写文件、输入输出、请求响应等等。I/O操作时最费时的,至少相对于代码来说,在传统的编程模式中,举个例子,你要读一个文件,整个线程都暂停下来,等待文件读完后继续执行。换言之,I/O操作阻塞了代码的执行,极大地降低了程序的效率。

下面是是一个C#读文件的例子:

private string ReadTxtToStr(string filename)
{
//打开文件,打开期间其他代码停止执行,直到完成打开后继续执行代码。
FileStream fs = File.Open(filename, FileMode.Open);
Console.WriteLine("我被打开文件阻塞了。");
StreamReader sr = new StreamReader(fs);
//读取文件,读取期间其他代码停止执行,直到完成读取后继续执行代码。
string str=sr.ReadToEnd();
Console.WriteLine("我被读取文件阻塞了。");
return str;
}
在上述代码中,两个Console.WriteLine()虽然会被执行,但是却被无辜地阻塞一段时间。理论上,如果读取这个文件需要10秒,我们就浪费了10秒在I/O等待中(实际程序运行中有很大一部分时间是浪费在I/O等待上的),在码农眼里这可是天文数字。
Having asynchronous I/O is good, because I/O is more expensive than most code and we should be doing something better than just waiting for I/O.
非阻塞I/O
理解了阻塞I/O,非阻塞I/O就好理解。非阻塞I/O是程序执行过程中,I/O操作不会阻塞程序的执行,也就是在I/O操作的同时,继续执行其他代码(这得益于Node的事件循环机制)。在I/O设备效率还远远低于CPU效率的时代,这种I/O模型(非阻塞I/O)为程序带来的性能上的提高是非常可观的。

好,下面感受一下怎么用Node.js实现非阻塞I/O,继续读文件,看码:

var fs = require("fs");
fs.readFile("./testfile", "utf8", function(error, file) {
if (error) throw error;
console.log("我读完文件了!");
});
console.log("我不会被阻塞!");
复制上面代码保存为test.js,并在同一目录下新建一个名为testfile的文件,用node命令运行test.js,你将看到以下输出:

我不会被阻塞!

我读完文件了!

这显然不符合传统的程序执行顺序,注意,这就是Node.js的非阻塞I/O了。

首先解释下面程序,如果你熟悉JavaScript,请忽略。

var fs = require("fs");
以上代码:引入Node.js内置的File System文件系统模块fs。require()相当与Java的import,C++的include。

fs.readFile("./testfile", "utf8", function(error, file) {
if (error) throw error;
console.log("我读完文件了!");
});
以上代码:进行I/O操作,给readFile绑定一个回调函数function(error,file){},并在读取testfile完成后执行回调函数。期间,后面的代码继续执行,不受I/O阻塞。

这就是为什么先看到“我不会被阻塞!”而后看到“我读完文件了!”的缘故。

Node.js事件轮询机制(event loop)
《Node入门》推荐我们去读一下Mixu的一篇关于事件轮询的博文,的确值得一读,我英语一般,开着词典还能勉强看,略懂吧。

Mixu说的最经典的一句话:

Everything runs in parallel except your code!

(在Node中)除了代码,一切都是并行的!

理解这句话,再去学Node,也就事半功倍了!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
kmose正确使用方法? 单位高温防护欠缺致员工中暑如何对待 狗狗为什么爱看视频 360浏览器怎么设置倍速播放 ...先讲女主的灵魂飘荡了一段时间,然后重生,请问是那本? 拯救者散热器怎么开 电脑如何一键还原系统电脑一键还原怎么操作 神舟笔记本电脑怎么重新设置神舟战神bios恢复出厂设置 神舟电脑恢复出厂设置神舟战神怎么恢复原厂系统 水泥楼梯如何铺木楼梯 nodejs可以模拟浏览器加载页面(包括页面上的js,css等)吗? 什么求组词 使用ant打包web的build.xml一定要自己写吗 nodejs-xlsx导出的excel,office打开提示“发现不可读取的内容”? node.js在什么工具上有提示 nodejs怎么读取log文件内容 如何使用nodejs做爬虫程序 php和node.js 如何将xml文件转成word文档? 客户端JavaScript 是否有权限读取用户硬盘上的本地文件 如何使用Visual Studio 2013开发nodejs Python和nodeJS哪个更适合做爬虫? 如何快速开发一个基于nodejs的会员管理系统 nodejs调用java代码 其中java写的方法要传入一个枚举类型的参数,nodejs有枚举类型吗? nodejs实现一个word文档解析器思路详解 100求解:javascript读简单的xml文件 nodejs 如何生成xml文件 自动化专业 就业好吗 电气工程及其自动化怎么烂的专业为什么要分那么高 电气工程及其自动化专业以后出来工作可以干什么 做梦梦到一只青蛙预示着什么 自己梦见他人,和我说他梦见青蛙和我笑啥意思? 梦见会说话的青蛙从水中跳出来,跟我很友好,我还跟它一起吃东西,它还帮助我做一些事情,我还抱着它, word中如何在表格中把字打到中央? 怎么用word文档把字打到a4纸大 microsoft word:如何把字打在线上? word怎么把字打在横线上 word2013怎么把文字打到图片上 word怎么才能把字打到表格里的正中间? 在word的文档里怎样把字打在横线上 在word里如何将上一行的文字快速输入到下一行 word 怎么把文字打印在有线的纸上 在word里怎样把一排字打在另外两排字的中间呢 如何把字体放到word里 word文字怎么打成一行 怎样把文字放入word表格中 经常吃哪些食物对口腔牙齿有好处? 对牙齿好的食物有哪些? 吃什么食物对牙齿有好处呢 对牙齿好的食物