javascript - 事件循环和 v8 引擎在 NodeJS 中如何交互?

标签 javascript node.js v8 event-loop

我不明白是什么让 NodeJS 看起来是单线程的?是事件循环是单线程的,还是实际的 JavaScript 代码是使用 v8 引擎在单线程中运行的?这两者(v8 和事件循环)如何相互作用?我在哪里可以看到这两者在实现代码中相遇的地方?

最佳答案

Node.js 对比 V8 对比事件循环

  • NodeJS 是基于 Chrome V8 JavaScript 引擎构建的 JavaScript 运行时。
  • Javascript 是单线程的,任何 Javascript 实现(如 NodeJS)也是如此。
  • 事件循环最重要的是一种编程结构(在消息/事件队列中循环),它是 JavaScript 并发模型的基础。
  • V8 提供事件循环的默认实现。 NodeJS 使用 libuv 提供的事件循环

他们如何“互动”?

我认为你的误解是——它真的是单线程的,但它“看起来是多线程的”。如何? - 因为事件循环。

因为 JavaScript 是单线程的,事件循环允许 NodeJS 在后台“并行”执行非阻塞 I/O 操作。 NodeJS 尽可能将这些操作卸载到系统内核(现在大多数是多线程的)

每当这些操作中的一个完成时 - 内核向 NodeJS 发出执行该操作回调函数的信号 - 添加该操作的回调函数到 poll 队列以在 poll 中执行> 事件循环的阶段(解释如下)。

启动时,NodeJS 初始化事件循环并开始处理。事件循环由一系列处理阶段、轮询阶段和用于 I/O 处理的队列组成。

Each phase has a FIFO queue of callbacks to execute. While each phase is special in its own way, generally, when the event loop enters a given phase, it will perform any operations specific to that phase, then execute callbacks in that phase's queue until the queue has been exhausted or the maximum number of callbacks has executed. When the queue has been exhausted or the callback limit is reached, the event loop will move to the next phase, and so on. src

您可以在此处查看有关处理阶段和事件循环的更多详细信息:The Node.js Event Loop, Timers, and process.nextTick() | Node.js

关于javascript - 事件循环和 v8 引擎在 NodeJS 中如何交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55082434/

相关文章:

javascript - 获取扩展对象的 TypeScript 代码补全

javascript - 在 Express-JS 中将 example.com 路由到静态文件,但将 example.com/anything 路由到其他文件

javascript - 远程调试 V8 引擎(不是 Node.js,而是 ClearScript)

variables - 为什么变量名以字母 'k' 开头?

javascript - V8 如何使用 requestAnimationFrame 重构异步堆栈跟踪?

javascript - 状态改变时 Mobx 不更新

javascript - ASP.NET MVC4 添加评论后刷新 View

javascript - 选择之前输入的 jQuery

android - Apache Cordova 和 PhoneGap 有什么区别?

javascript - 如何从 React 中的 cdn/script 标签导入 javascript 包?