gpt4 book ai didi

javascript - Node.js 可以排队多少个事件?

转载 作者:IT老高 更新时间:2023-10-28 23:18:26 26 4
gpt4 key购买 nike

据我所知,如果 Node 中的一个事件需要“很长时间”才能被调度,Node 会创建某种“事件队列”,并且它们会尽快被一一触发。

这个队列可以排多长时间?

最佳答案

虽然这似乎是一个简单的问题,但它实际上是一个相当复杂的问题;不幸的是,没有任何人可以给你一个简单的数字。

首先:墙上的时间在这里并没有真正发挥作用。所有事件都以相同的方式分派(dispatch),无论事情是否需要“很长时间”。换句话说,所有事件都经过一个“队列”。

第二:没有单一的队列。有很多地方可以将不同类型的事件分派(dispatch)到 JS 中。 (以下假设您是 know what a tick is。)

  • 有些东西是您(或您使用的库)传递给 process.nextTick() 的。它们在当前滴答结束时被调用,直到 nextTick 队列为空。
  • 有些东西是你(或你使用的库)传递给setImmediate()的。它们在下一个刻度开始时被调用。 (这意味着 nextTick 任务可以无限期地将东西添加到当前滴答,防止其他操作发生,而 setImmediate 任务只能将东西添加到下一个滴答的队列中。)
  • I/O 事件由 libuv 处理分别通过 Linux/Mac/Windows 上的 epoll/kqueue/IOCP。当操作系统通知 libuv 发生了 I/O 时,它会依次调用 JS 中的相应处理程序。事件循环的一个给定滴答可能会处理零个或多个 I/O 事件;如果一个滴答需要很长时间,I/O 事件将在操作系统队列中排队。
  • Signals由操作系统发送。
  • 在单独线程上执行的 native 代码 (C/C++) 可能会调用 JS 函数。这通常通过libuv work queue 来完成。 .

由于有很多地方可以排队,it is not easy to answer "how many items are currently queued" ,更不用说这些队列的绝对限制了。本质上,任务队列大小的硬性限制是可用 RAM。

实际上,您的应用将:

  • 命中 V8 堆约束
  • 对于 I/O,将允许打开的文件描述符的数量最大化。

...在任何队列的大小成为问题之前。

如果您只是对您的应用是否处于高负载感兴趣,toobusy可能很有趣——它对事件循环的每个滴答进行计时,以确定您的应用是否花费了异常多的时间来处理每个滴答(这可能表明您的任务队列非常大)。

关于javascript - Node.js 可以排队多少个事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34140101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com