Nodejs的官方释义:
一个搭建在Chrome JavaScript运行时上的平台,用于构建高速、可伸缩的网络程序。Node.js采用的事件驱动、非阻塞I/O模型,使它
既轻量又高效,并成为构建运行在分布式设备上的数据密集型实时程序的完美选择。
获取几组标签:基于Chrome JS引擎、可伸缩、事件驱动(事件轮询)、非阻塞I/O(异步I/O)、轻量、分布式、数据密集、实时......
今天聊聊事件轮询和非阻塞I/O
我们来看一小段jQuery用XMLHttpRequest(XHR)做Ajax请求的代码:
这个程序会发送一个到resource.json的HTTP请求。当响应返回时会调用带着参数 data 的匿名函数(在这个上下文中的“回调函数”), data 就是从那个请求中得到的数据。
注意,代码没有写成下面这样:
在这个例子中,假定对resource.json的响应在准备好后会存储在变量 data 中,并且在此之前函数 console.log 不会执行。I/O操作(Ajax请求)会“阻塞”脚本继续执行,直到数据准备好。因为浏览器是单线程的,如果这个请求用了400ms才返回,那么页面上的其他任何事件都要等到那之后才能执行。可以想象一下,如果一幅动画被停住了,或者用户试着跟页面交互时动不了,那种用户体验有多糟糕。
在Nodejs中,当浏览器中有I/O操作时,该操作会在事件轮询的外面执行(脚本执行的主顺序之外),然后当这个I/O操作完成时,它会发出一个“事件”,会有一个函数(通常称作“回调”)处理它。
这个I/O是异步的,并且不会“阻塞”脚本执行,事件轮询仍然可以响应页面上执行的其他交互或请求。这样,浏览器可以对客户做出响应,并且可以处理页面上的很多交互动作。
There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.