【发布时间】:2023-03-20 07:23:01
【问题描述】:
修改后的问题
我想知道 nodejs 的事件循环(无论它是什么底层实现,可能是 v8、libuv、libev)是如何在不耗尽 CPU 的情况下循环的。正如下面的代码示例所示,插入了一个 sleep 调用以“释放” CPU 并防止 while 循环耗尽 CPU。既然有人已经指出事实并非如此,那么我想知道 nodejs(或其底层库)为此目的采用了什么机制?
欢迎链接到源代码的相关部分。谢谢。
原始问题
我在询问 nodejs 内部:我想知道 nodejs 的事件循环中的滴答声之间是否有任何睡眠时间。
换句话说,我假设 nodejs 内部看起来像下面的代码,我想知道sometime 的值是什么,如果有的话。
while(true) {
for(event in queue) handleEvent(event);
sleep(sometime);
}
我做出这样的假设是因为我相信一定存在某种睡眠,这样 while 循环不会耗尽 CPU。
【问题讨论】:
-
堆栈以
.nextTick()展开,但根本不需要nodejs 进行睡眠,因此您从一个错误的假设开始。而且,您认为事件循环如何工作的伪代码也可能更正。 V8 Javascript 引擎是开源的。如果你真的需要知道,你可以去看看它是如何工作的。 -
但是,无论您的真正问题是什么(例如,您为什么认为您想知道这个?),我们都可能会有更好的运气来帮助您。
-
问题已修改,请查看。谢谢~
-
您必须找到 nodejs 代码的实际相关部分才能确定,但当然可以使用信号(如互斥锁)。它可以运行一个while循环,直到事件队列为空,然后在互斥体上等待。然后,当任何其他线程(例如磁盘 I/O 线程)将任何内容放入队列中时,例如事件队列中的完成回调,它会触发该互斥体,从而使其唤醒并服务于事件。这就是任何多线程排队系统的工作方式。
-
为您提供几个参考:libuv event loop design overview 和 Basics of libuv。
标签: node.js internal event-loop