浏览器页面是由消息队列和事件循环系统来驱动。事件循环的应用:setTimeout、XMLHttprequest.
浏览器渲染进程:
渲染进程中所有运行在主线程上的任务都需要先添加到消息队列,然后事件循环系统再按照顺序执行消息队列中的任务。
- 当接收到 HTML 文档数据,渲染引擎就会将“解析 DOM”事件添加到消息队列中,
- 当用户改变了 Web 页面的窗口大小,渲染引擎就会将“重新布局”的事件添加到消息队列中。
- 当触发了 JavaScript 引擎垃圾回收机制,渲染引擎会将“垃圾回收”任务添加到消息队列中。
- 同样,如果要执行一段异步 JavaScript 代码,也是需要将执行任务添加到消息队列中。
事件驱动机制
事件驱动模型(非阻塞式IO):当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。因为 webserver 一直接受请求而不等待任何读写操作。
单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。
nodejs, 1. 单线程 2. api异步方法
补充:
五种IO模型(阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO)
事件队列 事件循环 事件句柄
事件绑定(处理)
// 1.引入events对象, 创建eventEmiter对象
var events = require('events')
var eventEmiiter = new events.EventEmitter()
// 2. 绑定事件处理函数
var connectHandler = function connected() {
console.log('connect 被调用')
}
eventEmitter.on('connection', connectHandler()) // 事件绑定
// 3. 触发事件
eventEmitter.emit()