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 完成后通知线程调度响应事件即可。

图解:

async-io

示例代码:

异步式: 注意这里的异步式执行结果是,控制台会先打印 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 开发指南》


最后修改于 2014-03-29