Node.js 是单进程单线程应用程序,可是由于 V8 引擎提供的异步执行回调接口,经过这些接口能够处理大量的并发,因此性能很是高。html
事件循环能让 Node.js 执行非阻塞 I/O 操做,尽管JavaScript事实上是单线程的,事件循环经过在可能的状况下将相应操做分担给系统内核来实现。node
由于目前主流的内核都是多线程的,内核能够处理后台执行的多个操做。当其中一个操做完成的时候,内核告诉 Node.js,与其相应的回调就被添加到轮询队列(poll queue)中,并最终获得执行。web
Node.js 开始的时候会初始化事件循环,处理目标脚本,脚本可能会进行异步API调用、定时任务或者process.nextTick(),而后开始进行事件循环。多线程
下面是事件循环的操做顺序:并发
上图中每一个框分别表明事件循环的一个阶段,每一个阶段都会维持一个先进后出的可执行回调函数队列。每一个阶段都有本身特殊的行为方式,即当事件循环进入一个给定的阶段,它执行这个阶段的任何操做,而后执行这个阶段队列中的回调函数直到队列为空,或者回调函数调用次数达到上限。当知足这两个条件后,事件循环会进入下一个阶段。异步
在事件循环运行之间,Node.js 检查是否有正在等待的异步I/O 或者定时器,若是没有就清除并结束事件循环。socket
Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭而后进行处理,而后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型很是高效可扩展性很是强,由于webserver一直接受请求而不等待任何读写操做。函数
Node.js有多个内置的事件,能够经过引入 events 模块,,并经过实例化 EventEmitter 类来绑定和监听事件。性能
// 引入 events 模块 var events = require('events'); // 建立 eventEmitter 对象 var eventEmitter = new events.EventEmitter();
绑定事件处理程序:ui
eventEmitter.on('eventName', eventHandler);
经过程序触发事件:
eventEmitter.emit('eventName');
下列是完整代码(drive.js):
var events = require('events'); var eventEmitter = new events.EventEmitter(); var connectHandler = function connected() { console.log('链接成功'); eventEmitter.emit('data_received'); } eventEmitter.on('connection', connectHandler); eventEmitter.on('data_received', function(){ console.log('数据接收成功'); }); // 触发 connection 事件 eventEmitter.emit('connection'); console.log("程序执行完毕");
启动drive.js文件:
> node drive.js 链接成功 数据接收成功 程序执行完毕