node.js可以排队多less个事件?

从我看到的情况来看,如果Node中的一个事件需要“长时间”发送,Node会创build某种“事件队列”,并且会尽快触发它们。

这个队列可以多久?

虽然这可能看起来像一个简单的问题,但它实际上是一个相当复杂的问题。 不幸的是,没有任何人可以给你的简单号码。

第一:在这里任何东西都不是真正起作用的。 所有的事件都以同样的方式发出,不pipe事情是否“长时间”。 换句话说,所有事件都通过一个“队列”。

第二:没有单一的队列。 有很多地方可以把不同types的事件分派给JS。 (以下假设你知道打勾是什么 。)

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

由于有很多地方可能会排队工作, 所以要回答“目前有多less项目排队”并不容易 ,更不用说这些队列的绝对限制了。 本质上,任务队列大小的硬限制是可用RAM。

实际上,你的应用程序将会:

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

…在任何队列的大小变得有问题之前。

如果你只关心你的应用程序是否负载过重, 那么toobusy可能会引起人们的兴趣,它会计算事件循环的每个时间间隔,以确定你的应用程序是否花费了不寻常的时间处理每个tick可能表明你的任务队列非常大)。

对于特定事件的处理程序在事件发出后立即被同步调用(按照它们添加的顺序),它们不会被延迟。

事件处理程序的总数仅受v8和/或可用RAM数量的限制。

我相信你正在谈论的操作可能需要一定的时间才能完成,例如http请求或文件系统访问。

Node为您提供了一种asynchronous完成这些types的操作的方法,这意味着您可以告诉节点或第三方库启动一个操作,然后调用一些代码(您定义的函数)来通知您操作何时完成。 这可以通过事件监听器或callback函数来完成,两者都有其自身的局限性。

使用事件侦听器,您可以拥有的侦听器的最大数量取决于环境的最大arrays大小。 在node.js中,javascript引擎是v8,但根据这篇文章 ,第五ECMA标准规定的最大值为〜40亿元素,这是你永远不能克服的限制。

通过callback函数,你的限制是最大的调用堆栈大小,这意味着你的函数可以相互调用多大的深度。 例如,你可以有一个callback调用callback调用另一个callback等callback等。调用堆栈的大小决定了如何可能callback调用callback你可以有。 请注意,调用堆栈大小可能是事件侦听器的限制,也可能是多次执行的callback。

这些都是每个人的限制。