gpt4 book ai didi

javascript - 为什么 Node.js 事件循环需要多个阶段?

转载 作者:IT老高 更新时间:2023-10-28 23:13:02 25 4
gpt4 key购买 nike

阅读了数十篇描述 Node.js 事件循环的文章和文档,例如 Node.js 自己提供的一篇:https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

我简直无法理解:为什么事件循环需要多个阶段,每个阶段都有自己的回调队列?

所有文档和文章都以“这个阶段做某事并执行设置为 X 或 Y 的回调”的方式描述了循环的各个阶段,但从未真正解释过为什么首先需要这些单独的队列。

为什么 setTimeout()setImmediate() 的回调或套接字关闭需要在与应该是绝大多数的轮询阶段不同的点执行的回调被执行?

如果轮询阶段的回调队列在进入下一阶段之前已经耗尽,为什么不让一个队列因其他阶段执行的任何非队列相关操作而中断?

最佳答案

不必是这样的。一切都可能在一个队列中,但可以肯定的是,NodeJS 的创建者有一些理由按照他们的方式去做。我们知道 Javascript 是单线程的。所以,如果你说你想让一个事件在 5 秒后发生,那么就没有其他线程来确保这个事件真的在指定的时间运行。另一方面,不可能预先确定给定函数是否会持续 0.1 秒,即 4.5 秒。

因此,即使他们不必像以前那样做,将计时器功能放在高优先级队列中并首先处理它们也有客观的好处。这样系统就会知道是否应该紧急执行某事,并且可以在处理其他所有事情之前紧急执行它。此外,系统将知道在执行下一个计时器事件之前还有多少时间。

待处理的回调是系统等待的,因此它非常有用,而且将其放入第二个队列有客观的好处,该队列的优先级低于计时器,但高于其他事物。

正如我们在轮询部分看到的,它的行为取决于计时器队列的状态。

check 会执行 poll 阶段指定的一些事件。

关闭回调将在适当的情况下处理回调中断。

所以,我们可以从文章中理解所有这些方面,尽管我必须承认,它需要比人们期望的更多的思考来阐明它。

简而言之,它不必按照它的工作方式工作。有无数种可能的方法与此方法不同并且会很有效。

关于javascript - 为什么 Node.js 事件循环需要多个阶段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51750514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com