请通过浏览器功能收藏网页

nodejs系列: 异步式IO 非阻塞编程 基础概念介绍及简单的小例子 javascript

发布时间:2019-01-28 14:05:05  作者:本站编辑  来源:本站原创  浏览次数:
我有话说 | 分享 |
www.javainfo.com.cn 上干货 欢迎收藏

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 ')

 

目录结构

image.png

image.png

 

执行结果: 先打印 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 ')

 

image.png

 

执行结果 先打印文件内容  后打印 file read end 


根据执行结果, 我们可用看到 


1   同步与异步 文件读取的区别, 那就是代码执行顺序不一样。

2   我们也可用感觉的到 异步的时候  读取文件花费了一定的时间  , 

3   同步的方式线程在处理的时候 发生了等待(阻塞)事件,CPU充分利用


下一篇文章 我们来介绍  NODE的事件模块





如有疑问 请留言 欢迎提供建议
  • 0

    开心

  • 0

    板砖

  • 0

    感动

  • 0

    有用

  • 0

    疑问

  • 0

    难过

  • 0

    无聊

  • 0

    震惊

评论已有 0