2016-08-24 18 views
1

node.js的documentation描述了其基础事件循环的所谓的阶段
它明确指出空闲准备阶段是只在内部使用Node.js:为什么闲置和准备阶段仅在内部使用?

对于node.js的事件循环是libuv之一,不言而喻,这些阶段可能映射到libuv的idleprepare句柄上。
它们将有助于在组织软件中的任务时拥有更大的粒度。特别是,它们是执行I/O回调和投票阶段之间的唯一方式。
无论如何,他们不是从底层环境出口

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


注意:这只是好奇心。
我曾经与libuv和nodejs一起工作,我注意到了它,所以我想知道是否有技术上的原因或...呃,这是它的设计方式,没有特别的理由。

回答

1

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

  • 空闲手柄有一个可怕的名字:当循环实际上是空闲的,它们不运行。它们在循环迭代中运行一次,在定时器之后运行,并且如果任何空闲计时器处于活动状态,则循环将在零秒内阻塞I/O。所以它们可能很危险,因为如果不停止它,CPU会旋转。 > JS边界交叉(参见至MakeCallback呼叫),从而I/O回调可以推迟并稍后运行位 - 与process.nextTick注册

  • 回调的C++ <时被调用。如果你向JS公开了准备句柄,你会在C++代码中使用MakeCallback,所以process.nextTick回调函数中的一些也会在你准备好的回调函数中被调用。

作为一般说明:闲置,检查和准备句柄从某种程度上继承自libev(libuv在内部使用)。如上所述,在将libuv与其他库进行嵌入时,可以使用检查和准备,并且空闲句柄有些奇怪。而且,libuv现在也走自己的路,所以不是所有的libuv都会暴露在Node中。

0

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

此外,为什么你要在I/O回调和轮询阶段之间执行一些操作,因为你无法明确控制这些事情呢?

相关问题