nodejs和非阻塞io 和异步的区别

 我来答
买桖莲0gw
2017-09-29 · 超过48用户采纳过TA的回答
知道小有建树答主
回答量:152
采纳率:0%
帮助的人:75万
展开全部
阻塞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文件系统模块fsrequire()相与JavaimportC++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事半功倍
-
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式