首页 > 解决方案 > NodeJS 事件循环与事件队列优先级

问题描述

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

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

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

标签: javascriptnode.jsexpress

解决方案


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

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

您可以在此处阅读有关事件循环中不同类型事物的更多信息: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 之间的通信写得不好,很容易修复一次没有问题我意识到问题出在哪里。


推荐阅读