事件循环

Node.js 事件循环免费看

什么是事件循环,事件循环操作、事件驱动程序

04-11侠课岛    基础入门       

后端/Node.js/Node.js简明入门 9     0     154

什么是事件循环

Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。
事件循环能让 Node.js 执行非阻塞 I/O 操作,尽管 JavaScript 事实上是单线程的,事件循环通过在可能的情况下将相应操作分担给系统内核来实现。
因为目前主流的内核都是多线程的,内核可以处理后台执行的多个操作。当其中一个操作完成的时候,内核告诉 Node.js,与其相应的回调就被添加到轮询队列(poll queue)中,并最终得到执行。

事件循环操作

Node.js 开始的时候会初始化事件循环,处理目标脚本,脚本可能会进行异步API调用、定时任务或者process.nextTick(),然后开始进行事件循环。 下面是事件循环的操作顺序:
上图中每个框分别代表事件循环的一个阶段,每个阶段都会维持一个先进后出的可执行回调函数队列。每个阶段都有自己特殊的行为方式,即当事件循环进入一个给定的阶段,它执行这个阶段的任何操作,然后执行这个阶段队列中的回调函数直到队列为空,或者回调函数调用次数达到上限。当满足这两个条件后,事件循环会进入下一个阶段。

各个阶段介绍
  • timers(计时器):本阶段执行通过setTimeout() 和 setInterval() 安排的回调函数。
  • I/O callback: 执行几乎全部发生异常的 close 回调, 由定时器和setImmediate()计划的回调。
  • idle,prepare:内部使用。
  • poll(轮询): 获取新的 I/O 事件,nodejs这时会根据实际情况进行阻塞。
  • check: 由setImmediate() 设置的回调函数。
  • close callbacks: 例如 socket.on('close', ... )设置回调。 在事件循环运行之间,Node.js 检查是否有正在等待的异步I/O 或者定时器,如果没有就清除并结束事件循环。

事件驱动程序

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。 Node.js有多个内置的事件,可以通过引入 events 模块,,并通过实例化 EventEmitter 类来绑定和监听事件。

示例:
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

绑定事件处理程序:

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
连接成功
数据接收成功
程序执行完毕

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

9

本课评分:
  •     非常好
难易程度:
  •     适中的

内容目录


本文索引


|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?