【问题标题】:What is the sleep time between ticks in nodejsnodejs中滴答之间的睡眠时间是多少
【发布时间】: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 overviewBasics of libuv

标签: node.js internal event-loop


【解决方案1】:

不,没有睡眠,因为那会阻塞。 This answer 有很多与您的问题相关的 Node.js 内部细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多