当前位置: 首页 > 面试题库 >

Node.js事件循环

养振濂
2023-03-14
问题内容

Node.js I / O事件循环是单线程还是多线程?

如果我有多个I / O进程,则节点会将它们置于外部事件循环中。它们是按顺序处理(最快),还是处理事件循环以同时处理它们(…以及哪些限制)?


问题答案:

事件循环

Node.js事件循环在单个线程下运行,这意味着您编写的应用程序代码在单个线程上进行评估。Nodejs本身在libuv之下使用了许多线程,但是您在编写nodejs代码时不必处理那些线程。

每个涉及I / O调用的调用都要求您注册一个回调。该调用也会立即返回,这使您可以并行执行多个IO操作,而无需在应用程序代码中使用线程。一旦I /
O操作完成,它将在事件循环中推送其回调。一旦在事件上推送到该事件的所有其他回调都将被执行,它将立即执行。

有几种方法可以对将回调添加到事件循环中的方式进行基本操作。通常您不需要这些,但是有时它们会很有用。

  • setImmediate
  • process.nextTick

任何时候都不会有两个真正的并行执行路径,因此所有操作本质上都是线程安全的。通常,事件循环将管理多个异步并发执行路径。

阅读有关事件循环的更多信息

局限性

由于事件循环,节点不必为每个传入的tcp连接都启动一个新线程。只要您不为每个请求计算前1000个素数,这就能使节点同时处理数十万个请求。

这也意味着不要执行CPU密集型操作,这一点很重要,因为这些操作将锁定事件循环并阻止其他异步执行路径继续执行。请勿使用sync所有I /
O方法的变体,这也很重要,因为这些方法也将锁定事件循环。

如果您想做大量的CPU工作,则应将其委托给另一个进程,该进程可以更有效地执行CPU绑定的操作,也可以将其编写为本机附加组件。

阅读有关用例的更多信息

控制流

为了管理编写许多回调,您可能需要使用控制流库。我相信这是目前最流行的基于回调的库:

  • https://github.com/caolan/async

我曾经使用过回调,但它们几乎使我发疯,使用Promises时我有了更好的经验,bluebird是一个非常流行且快速的诺言库:

  • https://github.com/petkaantonov/bluebird

我发现这是节点社区(回调与Promise)中一个非常敏感的话题,因此,无论如何,请使用您认为适合自己的最佳方式。一个好的控制流库还应该为您提供异步堆栈跟踪,这对于调试非常重要。

事件循环中的最后一个回调完成它的执行路径并且不注册任何其他回调时,Node.js进程将完成。

这不是一个完整的解释,我建议您检查以下线程,它是最新的:

我如何开始使用Node.js



 类似资料:
  • 主要内容:事件驱动程序,实例,Node 应用程序是如何工作的?Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发

  • Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。 Node.js 几乎每一个 API 都是支持回调函数的。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发

  • 问题内容: 可以偷看事件循环进行诊断吗? 我想知道当前有多少事件在等待执行(不包括setTimeout / interval)。 更新:我想从正在运行的节点进程内部执行此操作。 问题答案: 使用setImmediate()为nodejs 0.10更新 虽然无法在队列中找到等待事件的数量,但发现了另一个可能有用的运行状况指标: 延迟将包含从排队事件到执行事件所花费的毫秒数。 这也考虑到了CPU密集型

  • 本文向大家介绍深入浅析Node.js 事件循环,包括了深入浅析Node.js 事件循环的使用技巧和注意事项,需要的朋友参考一下 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 (来源于Javascript是单线程又是异步的,但是这种语言有个共同的特点:它们是 event-driven 的。驱动它们的 event 来自一个异构的平台。) Node.js 的每一个

  • 问题内容: 首先,我开始尝试了解什么是Node.Js。我有两个问题。 第一个问题 从文章费利克斯的,它说:“只能有一个回调在同一时间发射。在此之前,回调完成执行,所有其他的回调都在排队等候”。 然后,考虑以下代码(从nodejs官方网站复制) 如果同时收到两个客户端请求,则意味着以下工作流程: 收到第一个http请求事件,收到第二个请求事件。 收到第一个事件后,将立即执行第一个事件的回调函数。 同

  • 问题内容: 我已经对Node.js架构的内部有了更多的了解,我看到的很多术语都是“滴答”,如“事件循环的下一个滴答”或nextTick()函数一样。 我还没有看到确切的定义是“滴答声”的确切含义。根据各种文章(例如本篇文章),我已经能够将一个概念拼凑起来,但是我不确定它的准确性。 我能否获得有关Node.js事件循环刻度的准确而详细的描述? 问题答案: 请记住,虽然JavaScript是单线程的,