【问题标题】:NodeJS event loop vs event queue priorityNodeJS 事件循环与事件队列优先级
【发布时间】:2021-04-03 15:35:58
【问题描述】:

据我了解,节点事件循环将继续处理请求,直到事件循环为空,此时它会查找事件队列以完成阻塞的 I/O 请求。

我的问题是.. 如果事件循环永远不会为空会发生什么?不是因为代码错误(即永无止境的循环),而是由于一致的客户端请求(想像谷歌这样的东西会收到永无止境的请求)?

我意识到我可能误解了服务器如何处理客户端请求的基本方面。

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

    事件循环实际上有几个不同的阶段(定时器、I/O、检查事件、挂起的回调等),它们以循环顺序进行检查。此外,无论当前正在处理事件循环的哪个阶段,有些东西(如 Promise 和其他微任务)都会排在前面。

    一种类型的事件的永无止境的集合可能会阻止事件队列为其他类型的事件提供服务。这将是一个需要预防的设计/实施问题。

    您可以在此处阅读有关事件循环中不同类型事物的更多信息:https://developer.ibm.com/tutorials/learn-nodejs-the-event-loop/ 和 https://www.geeksforgeeks.org/node-js-event-loop/ 和 https://snyk.io/blog/nodejs-how-even-quick-async-functions-can-block-the-event-loop-starve-io。

    虽然可以重载事件循环以使其不会脱离事件循环的一个阶段,但这并不常见,因为 nodejs 中的大多数处理方式都包含多个事件,这给了其他事情机会交错。例如,处理传入的http请求包括连接、读取、写入、关闭等……而该事件的处理可能涉及其他类型的事件。所以,你可能会重载一种类型的事件(我在我的编码中只做过一次,那是因为主线程和一堆 WorkerThreads 之间的通信写得不好,很容易修复一次没有问题我意识到了问题所在。

    【讨论】:

    • 感谢您对事件循环的详细回复。这个答案非常有帮助,但是我仍然对某些事情感到困惑……假设我们有一个处理请求的服务器,每个请求都被添加到节点“调用堆栈”中。此调用堆栈优先于任何 I/O 操作,所以如果在堆栈“清空”之前不断将新的 Web 请求添加到调用堆栈中会发生什么? I/O 堆栈或“事件队列”如何有机会返回已完成的操作?请求是否有可能在堆栈清空之前不断填充调用堆栈?
    • @austintreneff - 您在这里使用“调用堆栈”一词根本不正确,这让我对您在我的回答中所做的和不遵循的做法感到困惑。新的传入事件被添加到适当的事件队列,而不是调用堆栈。正如我在回答中所说,尽管非常非常罕见地用足够多的持续发生的事件来淹没特定事件队列,这可能会破坏获取其他类型事件的能力。但是,这通常不是您需要担心的事情,因为它在自然界中通常不会发生,或者如果它很少发生,它会在一段时间内发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 2012-05-27
    相关资源
    最近更新 更多