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

node.js的文档描述了其基础事件循环的所谓阶段
它明确指出, 空闲准备阶段只在内部使用

对于node.js的事件循环是libuv的循环 ,不用说这些阶段可能映射到libuv的空闲和准备句柄上。
他们将有助于在组织软件任务时获得更大的粒度。 特别是,它们是在执行I / Ocallback和投票阶段之间进行安排的唯一方法。
无论如何,它们不会从底层环境中导出

这些阶段被禁止的原因是什么,实际上给用户一个比libuv提供的事件循环显然最差的事件循环?
有没有其他的方式来按上述方式安排任务?


旁注:这只是好奇心。
我曾经与libuv和nodejs一起工作,我注意到了,所以我想知道是否有技术上的原因,或者…这是如何devise的,没有特别的理由。

我不认为有什么特别的理由来“禁止”他们。 而且,他们不是真的被禁止,他们只是没有暴露。 你可以创build一个Node插件,它允许你创build空闲和准备句柄,而且完全没有问题。 有一些事情你必须注意:

  • 空闲手柄有一个可怕的名字:当循环实际上空闲时它们不运行。 它们在循环迭代中运行一次,在定时器之后,如果任何空闲计时器处于活动状态,则循环将在零秒内阻塞I / O。 所以他们可能会很危险,因为如果不停止的话CPU会旋转。

  • 在process.nextTick中注册的callback会在C ++ < – > JS边界被越过时调用(请参阅MakeCallback调用),以便I / Ocallback可以延迟并稍后运行。 如果您向JS公开了准备句柄,那么您将在C ++代码中使用MakeCallback ,因此,一些process.nextTickcallbackMakeCallback在您准备callback的同时被调用。

作为一个普遍的说明:闲置,检查和准备句柄从某种程度上inheritancelibev(libuv曾经在内部使用)。 像上面提到的那样,在libuv和其他库中embedded时可以使用检查和准备,并且空闲的句柄有一些奇怪的地方。 另外,libuv最近也走自己的路,所以不是所有的libuv都会暴露在Node中。

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

另外,为什么你要在I / Ocallback和轮询阶段之间执行一些操作,因为你不能明确地控制这些东西呢?