Nodejs 必知的「事件循环」

简介: JavaScript引擎本身不实现事件循环机制。浏览器中的事件循环由浏览器实现的,NodeJS中事件循环主要是由底层Libuv库实现的。Libuv库是事件驱动的,其封装和统一了不同平台的API实现。NodeJS的跨平台和事件循环机制都是通过Libuv库实现的。

三言两语

这是我第三次学习事件循环,这次学明白啦。吃透NodeJS相关的原理,提高自己的水平。

今天沉淀总结下学习到内容

事件循环模型

JavaScript引擎本身不实现事件循环机制。浏览器中的事件循环由浏览器实现的,NodeJS中事件循环主要是由底层Libuv库实现的。

Libuv库是事件驱动的,其封装和统一了不同平台的API实现。NodeJS的跨平台和事件循环机制都是通过Libuv库实现的。

node事件循环.png

以上分四个步骤:

1、NodeJS的V8引擎解析JavaScript代码,然后调用Node API

2、NodeAPI将任务分配给Libuv库处理,

3、Libuv中通过事件循环机制管理这些任务的执行,处理结束后将结果返回给V8引擎。

4、V8引擎回调处理Libuv返回

微任务与宏任务

根据任务种类,划分不同的任务队列,微任务队列和宏任务队列。

宏任务:setTimeout、setInterval、setImmediate

微任务:promise.then()、promise.catch()、process.nextTick()

事件循环各阶段

  • timers阶段:执行所有setTimeout和setInterval的回调
  • pendding callback阶段:某些系统操作的回调。如TCP连接的错误
  • poll阶段:轮询等待新的链接和请求等事件,执行I/O回调。比如:文件读取操作
  • check阶段:执行setImmedidate的回调
  • close callback阶段:关闭回调执行,如socket.on(close...)

每个阶段都会执行当前阶段的任务队列,然后再执行当前阶段的微任务队列,只有执行完所有微任务才进行入下一阶段。

浏览器中事件循环区别:

浏览器中没有分多个阶段;优先级别:同步代码,微任务,宏任务

浏览器中,宏任务可能会有多个队列,但是微任务只有一个,每次都会先执行完微任务再执行宏任务

陈述总结

主要学习了,NodeJS的事件循环的模型,从V8引擎解析JS代码,然后调用NodeAPI,NodeAPI将任务分配给底层Libuv库去执行,主要事件循环机制都是由Libuv库完成的。

整个事件循环划分了6个阶段:timer阶段,pendding callback阶段、poll阶段、check阶段、close callback阶段,执行的顺序是:每个阶段中的任务队列执行完后再执行微任务,只有微任务执行完成后再执行下一个阶段。浏览器的事件循环没有划分阶段,优先级顺序:同步代码、微任务、宏任务。

面试题

题1:你对NodeJS的事件循环的理解?

回答:我对事件循环的理解Node是单线程的,主线程将所有任务都放在循环队列中,然后由底层的libuv库从循环事件队列中取出任务分配给不同的线程去处理,主线程同时也会进行回调处理,整个过程形成事件循环。

与浏览器事件循环不同点:

1、浏览器没有划分多个阶段

2、浏览器任务优先级:同步代码,微任务,宏任务

题2:事件队列中的任务执行顺序?

回答:NodeJS事件循环是划分多个阶段,执行顺序是:一个阶段执行完成后,再执行微任务,然后再进行下一阶段的执行。

目录
相关文章
|
1月前
|
JavaScript 调度 数据库
深入浅出:Node.js中的异步编程与事件循环
【9月更文挑战第30天】在Node.js的世界里,理解异步编程和事件循环是掌握其核心的关键。本文将通过浅显易懂的语言和实际代码示例,带你探索Node.js如何处理并发请求,以及它是如何在幕后巧妙地调度任务的。我们将一起了解事件循环的各个阶段,并学会如何编写高效的异步代码,让你的应用程序运行得更加流畅。
60 10
|
3月前
|
数据处理 调度 开发者
解密Python的异步编程:协程与事件循环的实战应用
在现代应用程序开发中,异步编程已经成为提高性能和响应速度的关键技术。Python的异步编程通过协程和事件循环提供了高效处理并发任务的能力。本文将深入探讨Python中异步编程的核心概念,包括协程的基本用法、事件循环的工作机制以及如何在实际项目中应用这些技术。通过对比同步和异步编程的性能差异,读者将能够理解异步编程的优势,并学会如何在Python中实现高效的异步任务处理。
|
3月前
|
JavaScript
Electron——如何使用nodejs工作线程
Electron——如何使用nodejs工作线程
79 4
|
3月前
|
大数据 API 调度
Python中的异步编程:理解asyncio模块与协程
在现代编程中,异步编程越来越重要,特别是在处理大规模并发任务时。Python的asyncio模块提供了强大的工具来实现异步操作,其中协程是其核心机制之一。本文将深入探讨asyncio模块的基本概念、如何编写和管理异步任务,以及协程的工作原理和实际应用。
|
4月前
|
存储 调度 Python
异步编程概述在 Python中,`asyncio`库提供了对异步I/O、事件循环、协程(coroutine)和任务的支持。
异步编程概述在 Python中,`asyncio`库提供了对异步I/O、事件循环、协程(coroutine)和任务的支持。
|
5月前
|
调度 开发者 UED
探索Python中的异步编程:从回调到协程
【6月更文挑战第14天】本文深入探讨了Python异步编程的演变历程,从最初的回调函数到现代的协程模型。我们将通过具体示例,展示如何利用asyncio库提升程序的执行效率和响应能力。文章旨在为读者提供一个清晰的异步编程发展脉络,并指导他们如何在项目中实际应用这些技术。
|
6月前
|
程序员 Python
探索Python中的异步编程:从回调地狱到协程魔法
本文探讨了Python中的异步编程,从传统的回调地狱到现代的协程技术。通过对回调函数、多线程、多进程和协程的对比分析,展示了协程在提高代码性能和可维护性方面的优势,并介绍了如何使用asyncio库实现异步编程的实践方法。
|
6月前
|
程序员 调度 数据库
Python中的异步编程:asyncio库和协程的深入解析
Python中的异步编程:asyncio库和协程的深入解析
177 0
|
网络协议 关系型数据库 MySQL
swoole协程框架?
Swoole是一个高性能的PHP扩展,可以用于构建异步、并发和高性能的网络应用。它提供了许多底层网络通信和多进程管理的功能,使得开发者可以更轻松地编写高性能的服务器程序。
97 0
|
Dart JavaScript 前端开发
《深入浅出Dart》事件循环和协程机制
事件循环和协程机制 Dart实现异步的方式同Javascript类似,如果你掌握Javascript的事件循环机制,那么学习Dart的异步机制就非常简单了 在 Dart 中,事件循环和协程是实现异步编程的核心机制。它们使得我们能够以非阻塞的方式处理异步操作,并允许在异步操作期间暂停和继续执行代码。本文将深入探讨 Dart 的事件循环和协程机制,并结合代码示例进行详细说明。
224 0