异步I/O,又称非阻塞式I/O,与大家习惯性的线性思维相去甚远。
同步I/O:或者叫阻塞式I/O一个线程只能处理一项任务,我们之前的经验就是,如果用户体验卡,就粗暴简单的开多线程
日常线性思维:
A->B->C
等A操作I/O完成之后,才能进行B,每个线程都是这样的
- 异步式:非阻塞式。线程不会等待I/O操作完成,而是会吧I/O请求发给系统,继续走自己的线程。当I/O操作完成之后,操作系统会以事件的形式通知原线程,所以说异步模式下线程必须有事件循环,不断检查I/O这边的情况
- 面对高并发的处理:
- 阻塞式:多线程,硬件多核CPU的利用,实际CPU的使用率并不高
- 非阻塞式:CPU利用率一直在100%,单线程就能应对
所以说单线程、非阻塞付出的成本就在编程思维的改变。
我们在node.js中体验一下
- 异步:
//异步读取
let fs=require('fs');
fs.readFile('app.js','utf-8',function(err,data){
if(err){
console.error(err);}
else{
console.log(data)}
});
console.log('not support Chinese');
//输出结果如下
not support Chinese
fileContent
- 同步
//同步读取
let fs=require('fs');
let data=fs.readFileSync('app.js','utf-8');
console.log(data);
console.log('not support Chinese');
//输出结果是
data
not support Chinese
事件
刚才上面提到事件循环:在Node中有一个事件队列。本质上程序的入口就是第一个事件循环的回调函数