Node.js事件循环

  • Node是单进程单线程应用程序,由于V8引擎提供异步执行回调接口,通过这些接口可以处理大量并发
  • Node中几乎每个API都支持回调函数,基本所有的事件机制都是观察者模式实现
  • Node单线程类似进入while事件循环,直至没有事件观察者退出,每个异步事件都生产一个事件观察者,如果事件发生则调用该回调函数u

1.事件驱动模型

在这里插入图片描述

当web server接收到请求,关闭进行处理,然后去服务下一个web请求;当此请求完成时,它被放至处理队列,当到达队列开头将结果返回给用户

实例

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

// 绑定事件及事件的处理程序
eventEmitter.on('eventName', eventHandler);


// 触发事件
eventEmitter.emit('eventName');

2.高并发策略

  • 一般而言,高并发解决方案就是提供多线程模型,服务器为每个客户端请求分配一个线程,使用同步I/O,系统通过线程切换来弥补同步I/O调用的时间开销
  • Node.js采用单线程模型,并不会为每个请求分配一个线程,而是用一个主线程处理所有请求,然后对I/O操作异步处理

3.事件循环

                在这里插入图片描述

  • 应用层APPLICATION:Javascript交互层,常见的就是Node模块,如:http,fs
  • V8引擎层:利用V8解析js语法,进而与下层API交互
  • Node API层:c语言实现,和操作系统交互
  • LIBUV层:跨平台的底层封装,实现事件循环,文件操作等
  • 事件循环的过程
  • Node.js在主线程中有一个事件队列,当接收请求后,就将该请求放入这个队列中。当主线程空闲时,开始循环事件队列,检查是否有要处理的事件
  • 如果是非I/O任务,就亲自处理(主线程)并通过回调函数返回上层调用;如果是I/O任务,就从线程池中拿出一个线程处理此请求,并指定回调函数
Node.js把每个任务当成事件处理,然后通过Event Loop模拟异步效果 Node.js的单线程是指Javascript运行在单线程中
  • 工作原理
    「1」定义事件队列
//队列是先进先出数据结构,利用数组模拟队列
// 数组的第一个元素是队头,最后一个元素是队尾
// shift() push()  length==0

「2」定义接收请求入口

// 接收用户的每个请求,传递参数request,response
// 定义一个事件对象
// 在队列的尾部添加该事件

「3」定义Event Loop

// 当主线程空闲时就开始循环事件队列
// 如果是I/O事件  交给线程池处理
// 如果是非I/O(非耗时)事件  主线程亲自处理,直接返回结果

「4」处理I/O任务

// 处理I/O任务  返回结果存入事件对象中
// 完成后 将该事件重新添加至队列的尾部
// 释放当前线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值