- Node.js 教程
- Node.js - 首页
- Node.js - 简介
- Node.js - 环境设置
- Node.js - 第一个应用
- Node.js - REPL终端
- Node.js - 命令行选项
- Node.js - 包管理器 (NPM)
- Node.js - 回调函数概念
- Node.js - 上传文件
- Node.js - 发送邮件
- Node.js - 事件
- Node.js - 事件循环
- Node.js - 事件发射器
- Node.js - 调试器
- Node.js - 全局对象
- Node.js - 控制台
- Node.js - 进程
- Node.js - 应用扩展
- Node.js - 打包
- Node.js - Express框架
- Node.js - RESTful API
- Node.js - 缓冲区
- Node.js - 流
- Node.js - 文件系统
- Node.js MySQL
- Node.js - MySQL入门
- Node.js - MySQL创建数据库
- Node.js - MySQL创建表
- Node.js - MySQL插入数据
- Node.js - MySQL查询数据
- Node.js - MySQL条件查询
- Node.js - MySQL排序
- Node.js - MySQL删除数据
- Node.js - MySQL更新数据
- Node.js - MySQL连接查询
- Node.js MongoDB
- Node.js - MongoDB入门
- Node.js - MongoDB创建数据库
- Node.js - MongoDB创建集合
- Node.js - MongoDB插入数据
- Node.js - MongoDB查找数据
- Node.js - MongoDB查询
- Node.js - MongoDB排序
- Node.js - MongoDB删除数据
- Node.js - MongoDB更新数据
- Node.js - MongoDB限制结果数量
- Node.js - MongoDB连接查询
- Node.js 模块
- Node.js - 模块
- Node.js - 内置模块
- Node.js - 实用工具模块
- Node.js - Web模块
- Node.js 有用资源
- Node.js - 快速指南
- Node.js - 有用资源
- Node.js - 讨论
Node.js - 事件循环
尽管JavaScript是单线程的,但Node.js通过尽可能将操作委托给系统内核来执行异步非阻塞I/O操作,从而使用事件循环。大多数现代操作系统内核是多线程的,能够通过在后台执行来处理多个操作。当当前操作完成后,内核会通知Node.js,以便可以将相应的回调添加到轮询队列中,最终执行。
Node.js启动后(通过提供.js脚本或在REPL模式下),事件循环就会初始化。下图显示了事件循环的操作顺序:
Timers阶段执行由setTimeout()和setInterval()调度的回调函数。
Pending callbacks阶段执行推迟到下一个循环迭代的I/O回调函数。
Poll阶段有两个主要功能:(a) 计算应阻塞和轮询I/O的时间长度;(b) 处理轮询队列中的事件。Node.js在此阶段检索新的I/O事件并执行与I/O相关的回调函数。
Check阶段在Poll阶段完成后立即执行回调函数。如果Poll阶段变为空闲并且脚本已使用setImmediate()计时器排队,则事件循环继续进入Check阶段,而不是等待。libuv库是Node.js运行时的一部分,负责提供处理异步操作的支持。
V8引擎处理JavaScript代码的执行,而Libuv库利用相应操作系统的原生机制来处理异步操作。
最后,Close callbacks阶段处理使用close事件注册的回调函数,例如socket.on(‘close’, function)。如果套接字突然关闭,则会发出close事件,否则将由process.nextTick()方法发出,以将函数的执行推迟到事件循环的下一个迭代。
在开始事件循环的下一个运行之前,Node.js会检查它是否正在等待任何异步I/O或计时器。如果没有,则运行时会干净地关闭。
了解事件循环的工作原理对于构建可扩展的Node.js应用程序至关重要。事件循环是Node.js的一个基本部分,它通过确保主线程不被阻塞来实现异步编程。