node.js的documentation描述了其底层事件循环的所谓阶段。 它还明确指出空闲和准备阶段仅在内部使用。
对于node.js的事件循环是libuv之一,不言而喻,这些阶段可能映射在libuv的idle和prepare句柄上。 在软件中组织任务时,它们有助于获得更大的粒度。特别是,它们是在执行I / O回调和轮询阶段之间安排某些事情的唯一方法。 无论如何,它们不是从底层环境导出的。
这些阶段被禁止的原因是什么,实际上给用户提供了比libuv提供的显然最差的事件循环? 有没有其他方式按上述方式安排任务?
旁注:这只是好奇心。 我曾经同时使用libuv和nodejs,我注意到了它,所以我想知道是否有技术原因或者......嗯,这就是它的设计方式,这就是全部,没有特别的原因。
我认为没有具体理由“禁止”他们。而且,它们并不是真的被禁止,它们只是没有暴露。您可以创建一个Node插件,它允许您创建空闲和准备句柄,根本不会有任何问题。你必须注意一些事情:
process.nextTick
中注册的回调(请参阅对MakeCallback
的调用),因此i / o回调可能会延迟并稍后运行。如果您向JS公开了prepare句柄,那么您将在C ++代码中使用MakeCallback
,因此一些process.nextTick
回调也将与您的准备回调一起调用。作为一般说明:空闲,检查和准备句柄以某种方式从libev继承(libuv曾经在内部使用)。在将libuv与其他库嵌入时,可以使用check和prepare,并且空闲句柄有点奇怪,如上所述。此外,libuv最近遵循自己的路径,因此libuv的所有内容都不会最终暴露在Node域中。
你可以问一个相反的问题“为什么你需要空闲阶段,例如暴露”?你可以使用setImmediate()
。
另外,为什么要在I / O回调和轮询阶段之间执行某些操作,因为您无法明确控制这些事情?