Node.js:为什么空闲和准备阶段只在内部使用?

Node.js:为什么空闲和准备阶段只在内部使用?,node.js,event-loop,libuv,Node.js,Event Loop,Libuv,node.js的描述了其底层事件循环的所谓阶段。 它还明确指出空闲和准备阶段仅在内部使用 因为node.js的事件循环是其中之一,不用说,这些阶段可能映射到libuv的和句柄上。 它们将有助于在软件中组织任务时获得更大的粒度。特别是,它们是在I/O回调的执行和轮询阶段之间安排工作的唯一方法。 无论如何,它们不会从基础环境导出 这些阶段被禁止的原因是什么,实际上给了用户一个明显比libuv提供的最差的事件循环? 有没有其他方法可以像上面提到的那样安排任务 旁注:这只是好奇。 我曾经使用libuv

node.js的描述了其底层事件循环的所谓阶段。
它还明确指出空闲和准备阶段仅在内部使用

因为node.js的事件循环是其中之一,不用说,这些阶段可能映射到libuv的和句柄上。
它们将有助于在软件中组织任务时获得更大的粒度。特别是,它们是在I/O回调的执行和轮询阶段之间安排工作的唯一方法。
无论如何,它们不会从基础环境导出

这些阶段被禁止的原因是什么,实际上给了用户一个明显比libuv提供的最差的事件循环?
有没有其他方法可以像上面提到的那样安排任务


旁注:这只是好奇。

我曾经使用libuv和nodejs,我注意到了这一点,所以我想知道这是否有技术原因,或者。。。嗯,这就是它的设计,仅此而已,没有特别的理由。

我认为没有具体的理由“禁止”它们。此外,它们并不是真正被禁止的,它们只是没有被暴露。您可以创建一个节点插件,它允许您创建空闲和准备句柄,这样就不会有任何问题。您必须注意以下几点:

  • 空闲句柄有一个可怕的名字:当循环实际处于空闲状态时,它们不会运行。每个循环迭代在计时器之后运行一次,如果任何空闲计时器处于活动状态,循环将阻塞i/o 0秒。因此,它们可能是危险的,因为如果不停止,CPU将旋转

  • < C++ >注册为“代码>进程”。当C++的JS边界被交叉时,调用NeXTICK/<代码>(参见调用<代码> MakEcCalbBe>代码>),因此I/O回调可以推迟并运行一段时间。如果您暴露了对JS的准备句柄,您将在C++代码中使用<代码> MKECALLACKE//COD>,所以一些<代码>过程。NEXTICK/<代码>回调也将与您的准备回调一起调用。


一般来说,idle、check和prepare句柄是从libev(libuv在内部使用)继承的。在将libuv嵌入其他库时可以使用Check和prepare,正如我前面提到的,空闲句柄有点奇怪。此外,现在libuv遵循自己的路径,因此并非libuv拥有的所有内容最终都会暴露在节点区域。

您可以问一个相反的问题“例如,为什么需要空闲阶段才能暴露”?您只需使用
setImmediate()

另外,为什么要在I/O回调和轮询阶段之间执行某些操作,因为您无论如何都不能显式地控制这些操作