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

Node.js事件循环滴答到底是什么?

席俊
2023-03-14
问题内容

我已经对Node.js架构的内部有了更多的了解,我看到的很多术语都是“滴答”,如“事件循环的下一个滴答”或nextTick()函数一样。

我还没有看到确切的定义是“滴答声”的确切含义。根据各种文章(例如本篇文章),我已经能够将一个概念拼凑起来,但是我不确定它的准确性。

我能否获得有关Node.js事件循环刻度的准确而详细的描述?


问题答案:

请记住,虽然JavaScript是单线程的,但是节点的所有I /
O和对本机API的调用都是异步的(使用特定于平台的机制),或者在单独的线程上运行。(这些都是通过libuv处理的。)

因此,当套接字上有可用数据或本机API函数返回时,我们需要一种同步方式来调用对刚刚发生的特定事件感兴趣的JavaScript函数。

出于与常规多线程应用程序中遇到的相同原因-竞争条件,非原子内存访问等原因,仅从发生本机事件的线程中调用JS函数是不安全的。

因此,我们要做的是以线程安全的方式将事件放在队列中。在过度简化的伪代码中,如下所示:

lock (queue) {
    queue.push(event);
}

然后,回到主要的JavaScript 线程 (但在C方面),我们执行以下操作:

while (true) {
    // this is the beginning of a tick

    lock (queue) {
        var tickEvents = copy(queue); // copy the current queue items into thread-local memory
        queue.empty(); // ..and empty out the shared queue
    }

    for (var i = 0; i < tickEvents.length; i++) {
        InvokeJSFunction(tickEvents[i]);
    }

    // this the end of the tick
}

while (true)(这实际上不存在于节点的源代码;这是纯说明性)表示 事件循环 。内部组件for为队列中的每个事件调用JS函数。

这是一个勾号:与任何外部事件关联的零个或多个回调函数的同步调用。清空队列并返回最后一个函数后,刻度结束。我们返回到开头(下一个刻度),并检查
在JavaScript运行时 从其他线程添加到队列的事件。

什么可以将内容添加到队列中?

  • process.nextTick
  • setTimeout/setInterval
  • I / O(来自fsnet等的东西)
  • crypto的处理器密集型功能,例如加密流,pbkdf2和PRNG(实际上是…的示例)
  • 使用libuv工作队列进行同步C / C ++库调用的所有本机模块看起来都是异步的


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

  • 问题内容: Node.js I / O事件循环是单线程还是多线程? 如果我有多个I / O进程,则节点会将它们置于外部事件循环中。它们是按顺序处理(最快),还是处理事件循环以同时处理它们(…以及哪些限制)? 问题答案: 事件循环 Node.js事件循环在单个线程下运行,这意味着您编写的应用程序代码在单个线程上进行评估。Nodejs本身在libuv之下使用了许多线程,但是您在编写nodejs代码时不

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

  • 本文向大家介绍什么是事件循环?相关面试题,主要包含被问及什么是事件循环?时的应答技巧和注意事项,需要的朋友参考一下 Node采用的是单线程的处理机制(所有的I/O请求都采用非阻塞的工作方式),至少从Node.js开发者的角度是这样的。而在底层,Node.js借助libuv来作为抽象封装层,从而屏蔽不同操作系统的差异,Node可以借助livuv来实现线程。下图表示Node和libuv的关系 Libu

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

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