非阻塞I/O
非阻塞I/O 也叫异步I/O
传统的服务器语言大多是多线程、阻塞式I/O 这也是Node与众不同的地方,对于传统的服务器而言,在与用户建立连接时,每一个连接都是一个线程,当有十万个用户连接时,服务器上就会有十万个线程。而阻塞式I/O是指,当一个线程在执行I/O操作时,这个线程会阻塞,等待I/O操作完成之后继续执行。
代码
a.js
var fs=require("fs")
var data=fs.readFileSync("input.txt")
console.log(data.toString());
console.log("执行结束");
b.js
var fs=require("fs")
fs.readFile("input.txt",function(err,data){
if(err){
return console.error(err);
}
console.log(data.toString());
})
console.log("执行结束");
上面两个代码中,a是使用的同步I/O,也就是阻塞式I/O 因此等待文件操作结束后才继续向下执行。b中使用的就是异步I/O,也叫非阻塞式I/O,当执行文件操作时,会继续向下执行,因此先打印了执行结束
Nodejs event模块处理异步
1、回调函数处理异步(非阻塞)
var fs=require("fs");
//阻塞请求数据 等待请求完成再执行后续代码
var data=fs.readFileSync("mime.json");
console.log(data.toSrting);
//非阻塞式请求代码 nodejs中多数方法为异步请求方式
fs.readFile("mime.json",function(err,res){
if(err){
throw err;
}
console.log(res.toString());
});
console.log(1);
//处理异步请求 外边可以获取到请求的数据的方式
//1、使用回调函数来获取数据
function getMine(callback){
fs.readFile("mime.json",function(err,res){
if(err){
throw err;
}
callback(res.toString());
});
}
console.log(1);
//这样就可以在外部获取异步的数据 也可以暴露出去别的文件使用
module.exports=getMime(function(data){
console.log(data);
});
2、使用nodejs内置模块事件的驱动event来进行数据的广播和监听
var fs=require("fs");
var event=require("events");
//实例化事件的对象
var EventEmitter=new event.EventEmitter();
//使用events模块 获取异步的数据
//在请求完数据之后进行广播
fs.readFile("mime.json",function(err,res){
if(err) throw err;
EventEmitter.emit("mime",res.toString());
});
//在外部进行监听广播
EventEmitter.on("mime",function(data){
console.log(data);
});