Node.js 事件循环机制:解析 JavaScript 异步魔力的核心 | 您所在的位置:网站首页 › node语言是什么 › Node.js 事件循环机制:解析 JavaScript 异步魔力的核心 |
前言
我们在做项目开发时,可以用 Node.js 写后端拿到后端的数据。这就使得我们能快速且较低的成本过渡成为一名全栈工程师,当然你也要会数据库。我们知道 Node.js 是可以运行 JavaScript 代码的,JavaScript 中是有异步代码的,那它是怎样处理异步的呢? Node.js 它的核心思想是通过事件驱动来处理异步操作的,而且它和浏览器是不一样的,接下来我们一起来看一下吧。 什么是Node?Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,基于 Chrome V8 引擎构建而成。它允许开发人员使用 JavaScript 编写服务器端和命令行工具,实现高性能和可伸缩的网络应用程序。而且它是非阻塞的、事件驱动的 I/O 模型,有着自己独特的一套事件循环机制可以处理 JavaScript 中的异步。 运行在单线程上 为了处理异步,线程必须要有循环,不断地检查是否有未处理的事件,依次处理。 吞吐量。 如果同时有多个客户端访问node,node仅仅有一个线程,不会给每一个客户都创建一个线程。这样的好处是:操作系统完全没有创建线程和销毁线程的时间开销。 弊端是: 无法利用多核CPU。 错误会引起整个应用无法继续调用异步I/O。 大量计算占用CPU导致无法继续调用异步I/O。 libuv库看下图:
由于Node.js善于 I/O (任务调度)不善于计算,有以下应用场景: 考试系统,实时交互系统等高并发的web应用。 多人联网的游戏。 聊天室,图文直播。 Node事件循环机制 是什么?Node.js 的事件循环机制是指用于处理异步操作和事件驱动的核心机制。Node.js 采用单线程的事件驱动模型,通过事件循环来处理和调度异步操作,以实现高效的非阻塞 I/O。 基本工作原理Node.js 的事件循环机制分为本轮循环和次轮循环,像process.nextTick() 和 Promise.then 的回调等异步任务追加到本轮循环; Promise.then 的回调,微任务队列追加在process.nextTick()后面,也属于本轮循环。 setTimeout,setInterval,setImmediate的回调等异步任务追加到次轮循环。 我们直接看下面展示: ┌───────────────────────────┐ ┌─>│ timers │ //此阶段包括setTimeout,setInterval │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ //大部分的普通回调事件 │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │ console.log('setImmediate')) process.nextTick(() => console.log('nextTick')) async1() new Promise(function (resolve) { console.log('promise1') resolve() console.log('promise2') }).then(function () { console.log('promise3') }) console.log('script end')先执行同步代码:'script start','async1 start','async2','promise1','promise2','script end'; 接下来就是异步代码,'async1 end','promise3'进入到微任务队列quene mic['async1 end','promise3'],'nextTick' 就入到 nextTick 队列 nextTickQueue['nextTick']属于本轮循环,而且nextTick 队列比微任务队列先输出; 'setTimeout0''setTimeout3''setImmediate'追加到次轮循环。'setTimeout3'打印需要耗时所以先打印'setImmediate'最后再打印'setTimeout3' 最终输出顺序为: //script start //async1 start //async2 //promise1 //promise2 //script end //nextTick //async1 end //promise3 //setTimeout0 //setImmediate //setTimeout3因为定时器是有误差的,所以有可能'setTimeout3'打印顺序在'setTimeout0'后面,'setImmediate'最后打印。 小结看到这里,相信大家对Node.js 事件循环机制有了一定的了解。Node.js 的事件循环机制使得它能够高效地处理并发请求和异步操作,我们可以通过事件驱动的方式提高代码的可读性和可维护性,不得不说Node.js 已经成为了我们前端在服务器端开发领域的重要工具之一。本篇文章到这就结束了,点赞与收藏是对作者最大的鼓舞ヾ(◍°∇°◍)ノ゙ |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |