理解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的异步编程~。如有任何疑问或者问题,欢迎联系我。
分享到:
相关推荐
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non...
//指定信号SIGIO,并绑定处理函数 signal(SIGIO,aio_async_func); //把当前线程指定为将接收信号的进程 fcntl(fd,F_SETOWN,getpid()); //获取当前线程状态 fcntl(fd, F_GETFD); //设置当前线程为 FASYNC 状态
Asynchronous IO with Boost.Asio - Michael Caisse - CppCon 2016.pdf
Linux AIO (asynchronous IO) facility test.
异步函数同步_Make_an_asynchronous_function_synchronous_javascript
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统...(4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。 深入浅出介绍这几种模型
以同步方式编写异步代码 Write asynchronous code as if it's synchronous
(1)同步阻塞IO(BlockingIO):即传统的IO模型。...(4)异步IO(AsynchronousIO):即经典的Proactor设计模式,也称为异步非阻塞IO。同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用
那么啊阻塞IO、非阻塞IO、同步IO和异步IO的区别在哪? 阻塞IO和非阻塞IO的区别 调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kernel还准备数据的情况下会立刻返回。 同步IO和异步IO的...
Asynchronous Query Execution异步查询
2、同步与异步的区别 同步(Synchronous):在执行某个操作时,应用程序必须等待该操作执行完成后才能继续执行。 异步(Asynchronous):在执行某个操作时,应用程序可在异步操作执行时继续执行。实质:异步操作,...
学习Clifford_E论文之后完成的异步FIFO,可以完成异步时钟下的数据同步
Lazy Asynchronous IO for Event-Driven Servers-计算机科学
异步(Asynchronous, async)是与同步(Synchronous, sync)相对的概念。 在我们学习的传统单线程编程中,程序的运行是同步的(同步不意味着所有步骤同时运行,而是指步骤在一个控制流序列中按顺序执行)。而异步的...
Asynchronous function calls utilizing multiple threads. 开源的异步通讯单元,有了这个,做异步通讯变得如此简单。
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)。所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。...
presentation by Henrik Thostrup Jensen
AJAX 指异步 JavaScript 及 XML(Asynchronous JavaScript And XML)。 AJAX 是一种在 2005 年由 Google 推广开来的编程模式。 AJAX 不是一种新的编程语言,而是一种使用现有标准的新方法。 通过 AJAX,你可以创建更...
AS DIGITAL DESIGN BECOMES INCREASINGLY SOPHISTICATED,CIRCUITS WITH MULTIPLE CLOCKS MUST RELIABLY COMMUNICATE WITH EACH OTHER. Crossing the abyss: asynchronous signals in a synchronous world