- 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把每个任务当成事件处理,然后通过Event Loop模拟异步效果 Node.js的单线程是指Javascript运行在单线程中
- Node.js在主线程中有一个
事件队列
,当接收请求后,就将该请求放入这个队列中。当主线程空闲时,开始循环事件队列,检查是否有要处理的事件- 如果是非I/O任务,就
亲自处理
(主线程)并通过回调函数返回上层调用;如果是I/O任务,就从线程池
中拿出一个线程处理此请求,并指定回调函数
- 工作原理
「1」定义事件队列
//队列是先进先出数据结构,利用数组模拟队列
// 数组的第一个元素是队头,最后一个元素是队尾
// shift() push() length==0
「2」定义接收请求入口
// 接收用户的每个请求,传递参数request,response
// 定义一个事件对象
// 在队列的尾部添加该事件
「3」定义Event Loop
// 当主线程空闲时就开始循环事件队列
// 如果是I/O事件 交给线程池处理
// 如果是非I/O(非耗时)事件 主线程亲自处理,直接返回结果
「4」处理I/O任务
// 处理I/O任务 返回结果存入事件对象中
// 完成后 将该事件重新添加至队列的尾部
// 释放当前线程