Nodejs-非阻塞I/O&事件驱动
2016-08-22 16:00
295 查看
1.关于es6变量
const 定义常量,不会发生改变的就用这个
let 定义局部变量
如:
const fs=require('fs');//require()表示载入这个模块
function aa(){
for(var i=0;i<10;i++){}
}
这个i变量用var定义,就把i变成全局变量,导致在function aa()这个作用域块被污染了。可以用let定义它,这样不会造成污染,只会在for的作用域里面作用
function aa(){
for(let i=0;i<10;i++){}
}
2.非阻塞I/O(Node核心特性)&事件轮询
Nodejs两个主要特点:单线程、非阻塞。
Node通过事件驱动的方式处理请求时无需为每一个请求创建额外的线程。在事件驱动的模型当中,每一个IO工作被添加到事件队列中,线程循环地处理队列上的工作任务,当执行过程中遇到来堵塞(读取文件、查询数据库)时,线程不会停下来等待结果,而是留下一个处理结果的回调函数,转而继续执行队列中的下一个任务。这个传递到队列中的回调函数在堵塞任务运行结束后才被线程调用。
事件轮询模型
如上图所示,每个异步函数执行结束后,都会在事件队列中追加一个事件(同时保存一些必要参数)。事件轮询下一次循环便可取出事件,然后会调用异步方法对应的回调函数(参数)。这样一来,nodejs便能保证开发者编写的每行代码(每个回调)均在主线程中执行。注意这里有一个问题,如果开发者在回调函数中调用了阻塞方法,那么整个事件轮询就会阻塞,事件队列中的事件得不到及时处理。正因为这样,nodejs中的一些库方法均是异步的,也提倡用户调用异步方法。
const 定义常量,不会发生改变的就用这个
let 定义局部变量
如:
const fs=require('fs');//require()表示载入这个模块
function aa(){
for(var i=0;i<10;i++){}
}
这个i变量用var定义,就把i变成全局变量,导致在function aa()这个作用域块被污染了。可以用let定义它,这样不会造成污染,只会在for的作用域里面作用
function aa(){
for(let i=0;i<10;i++){}
}
2.非阻塞I/O(Node核心特性)&事件轮询
Nodejs两个主要特点:单线程、非阻塞。
Node通过事件驱动的方式处理请求时无需为每一个请求创建额外的线程。在事件驱动的模型当中,每一个IO工作被添加到事件队列中,线程循环地处理队列上的工作任务,当执行过程中遇到来堵塞(读取文件、查询数据库)时,线程不会停下来等待结果,而是留下一个处理结果的回调函数,转而继续执行队列中的下一个任务。这个传递到队列中的回调函数在堵塞任务运行结束后才被线程调用。
事件轮询模型
如上图所示,每个异步函数执行结束后,都会在事件队列中追加一个事件(同时保存一些必要参数)。事件轮询下一次循环便可取出事件,然后会调用异步方法对应的回调函数(参数)。这样一来,nodejs便能保证开发者编写的每行代码(每个回调)均在主线程中执行。注意这里有一个问题,如果开发者在回调函数中调用了阻塞方法,那么整个事件轮询就会阻塞,事件队列中的事件得不到及时处理。正因为这样,nodejs中的一些库方法均是异步的,也提倡用户调用异步方法。
相关文章推荐
- 【Todo】React & Nodejs学习 &事件驱动,非阻塞IO & JS知识栈:Node为主,JQuery为辅,Bootstrap & React为辅辅,其他如Angular了解用途即可
- Nodejs之事件驱动+非阻塞io模型
- nodejs笔记之:事件驱动,线程池,非阻塞,异常处理等
- node学习(4)-- Nodejs 的非阻塞 I/O、异步、事件驱动
- Node学习笔记——NodeJS的事件驱动
- JavaScript事件驱动机制&定时器机制
- JavaScript事件驱动机制&定时器机制
- NodeJs--事件驱动(EventEmitter)
- 单线程、事件驱动、异步非阻塞的nginx
- (一) 这就是所谓的Node.js------单线程,非阻塞,事件驱动
- Nodejs的单线程、异步IO与事件驱动
- nodejs 事件驱动
- 如何理解Node.js中 单线程、非阻塞IO、事件驱动
- NodeJS中的异步I/O、事件驱动
- 关于”nodejs基于事件驱动”的思考
- NodeJS中的异步I/O、事件驱动
- 单线程、事件驱动、异步非阻塞的nginx
- nodejs 异步I/O和事件驱动
- Nodejs的事件驱动模式
- 前端学习(六)回调,异步,非阻塞,事件驱动等知识