nodejs系列: 异步式IO 非阻塞编程 基础概念介绍及简单的小例子 javascript
nodejs 相关的基础概念学习
NODE语言采用 异步式I/O与 事件 紧密结合的编程模式。在这种模式下,我们并不能采用原有的顺序执行模式来写实现某个复杂功能, 而是需要将 事件 和 回调函数 来组织程序的执行顺序, 将一个逻辑拆分为若干个组织块。
阻塞模式 线程模式 概念:
1.同步式I/O或阻塞式I/O
线程在执行中如果遇到磁盘读写或网络通信,通常要耗费较长时间。这时操作系统会剥夺这个线程的CPU控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式成为阻塞,当I/O操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权、令其继续执行。
2.异步式I/O或非阻塞式I/O
针对所有I/O操作不采用阻塞策略,当线程遇到I/O操作时,不会以阻塞的方式等待I/O操作的完成或数据的返回,而只是讲IO请求发送给操作系统,继续执行下一条语句,当操作系统完成IO操作时,以事件的形式通知原线程执行,线程会在特定时候处理这个事件,为了处理异步IO,线程必须有事件循环,不断的检查有没有未处理的事件,按顺序予以处理。
3.非阻塞与阻塞模式区别
非阻塞模式下,一个线程永远在执行计算操作,这个线程所使用的CPU核心利用率永远是100%,IO以事件的方式通知线程(告知阻塞事件已经完成,可用进行下面的操作了),
阻塞模式下,多线程往往能提高系统吞吐量,因为一个线程阻塞还有其他线程在工作,多线程可以让CPU资源不被阻塞中的线程浪费。
4.同步式IO与异步式IO区别
同步式IO(阻塞式)
利用多线程提高数据处理能力,通过事件片分割和线程调度来使多核CPU和操作系统发挥更高的利用率; 内存轨迹大; 数据局部性弱 ; 符合线性的编程思维 。
异步式IO(非阻塞)
单线程即可实现高吞吐量; 通过功能划分利用多核CPU 可以将单线程绑定到单核CPU ; 可以充分利用CPU资源 ; 内存轨迹小;数据局部性强 ; 不符合传统编程思维 。
我们以文件读取的例子,感受一下异步IO
File.js内容
var fs = require('fs'); //引入模块 fs.readFile('file.txt','UTF-8',function(err,data){ //默认的方式就是异步模式 if(err){ console.log('read file err '); }else{ console.log(data); } }) console.log('file read end ')
目录结构
执行结果: 先打印 file read end ; 之后等待IO事件通知 文件读取完毕 再打印文件内容。
感受一下 同步IO 的模式
上面的JS文件内方法进行修改为同步模式
var fs = require('fs'); var data = fs.readFileSync('file.txt','UTF-8'); //同步方式读取数据 console.log(data); console.log('file read end ')
执行结果 先打印文件内容 后打印 file read end
根据执行结果, 我们可用看到
1 同步与异步 文件读取的区别, 那就是代码执行顺序不一样。
2 我们也可用感觉的到 异步的时候 读取文件花费了一定的时间 ,
3 同步的方式线程在处理的时候 发生了等待(阻塞)事件,CPU充分利用
下一篇文章 我们来介绍 NODE的事件模块
如有疑问 请留言 欢迎提供建议
评论已有 0 条