zoukankan      html  css  js  c++  java
  • NodeJS示例异步式(Asynchronous)IO与同步式Synchronous)IO

    理解IO

         IO(Input/Output)通常是指计算机线程进行慈磁盘读写或者网络通信时的一种行为。
     
    同步式(Synchronous)IO和异步式(Asynchronous )IO
     
         同步式:当计算机调度线程进行I/O操作命令后,由于文件的读写或者网络通信需要较长的操作时间,操作系统为了充分利用cpu,此时会暂停到当前的I/O线程对CPU的控制(故又称同步式为阻塞式I/O),把cup资源然给其他的线程资源,当I/O线程完成了操作时,此时操作系统会恢复此时的I/O线程,从而当前I/O线程重新获得了cup的的控制权,继续完成其他操作。
         NodeJs让很多前端开发者利用JS开发服务器变得异常的简单,而异步式I/O则是NodeJs的一大特点。
         异步式:异步式IO又称非阻塞式I/O,异步式与同步式不同的是,当线程进行IO操作时,操作系统并不是暂停当前的线程操作,而是执行完I/O指令后,操作系统继续让当前线程执行下一条指令,当I/O操作完成后,会通过事件(event)通知I/O线程,而线程在接收到通知后,会处理响应事件。
         简单的说,同步式是让通过多个线程完成多个任务,而异步式则是通过一个线程完成多个任务,遇到I/O操作时,依然让线程继续执行其他指令,只是在I/O完成后通知线程调度响应事件即可。
     
    图解:
      
    示例代码:
     
    异步式:
    注意这里的异步式执行结果是,控制台会先打印read over,然后才打印package.json文件中的内容,也就是说,线程执行文件IO时,继续先执行了console.log('read over'); 待读取操作结束后通知线程响应此时的回调函数,执行了结果打印操作。
     1 /*
     2 * 异步式(Asynchronous) I/O Example. 7 */
     8 var file = require('fs');//声明对象
     9 //异步式读取
    10 file.readFile('file.json','utf-8', function(error,data) {
    11     if (error) {
    12         console.error(error);
    13     } else {
    14         console.log(data);
    15     }
    16 });
    17 //读取结束
    18 console.log("read over.");

    运行结果:

    1 >node readfile.js
    2 >read over.
    3 >{
    4         "description" : "this is Synchronous I/O and Aynchronous I/O test."
    5  }  

     

    同步式:

    此次执行的结果则是先读取完package.json文件的内容并打印, 然后打印read over.
     1 /**
     2 * 同步式(Synchronous) I/O Example.
     3 */
     6 var file = require('fs');//声明对象
     7 //readFileSync()方法为NodeJs官方提供的同步式文件读取方法,
     8 //但是官方并不推荐。
     9 var data = file.readFileSync('file.json', 'utf-8');
    10 console.log(data);
    11 //读取结束
    12 console.log("read over.");
    运行结果:
      
    1 >node readfile.js
    2 >{
    3         "description" : "this is Synchronous I/O and Aynchronous I/O test."
    4    }  
    5 >read over.  

     

    结语: 
         通过这2段代码的运行结果,相信大家对同步于异步的理解应该更加一目了然了。初次接触Node的朋友可以去官网查看教程,安装NodeJs,
    亲手尝试尝试NodeJs的异步编程~。如有任何疑问或者问题,欢迎联系我。
     
    注:参考《NodeJs开发指南》
  • 相关阅读:
    模块化、结构化的代码,何尝不是在讲人生
    DOS操作文件或文件夹
    OSQL
    DOS 命令大全
    Red Tea
    SetInterval_1
    SetInterval
    分库分表——Sharding-Sphere
    线上redis热key问题
    线上redis bgsave导致服务响应延迟
  • 原文地址:https://www.cnblogs.com/zivxiaowei/p/3632482.html
Copyright © 2011-2022 走看看