【发布时间】:2021-04-03 15:35:58
【问题描述】:
据我了解,节点事件循环将继续处理请求,直到事件循环为空,此时它会查找事件队列以完成阻塞的 I/O 请求。
我的问题是.. 如果事件循环永远不会为空会发生什么?不是因为代码错误(即永无止境的循环),而是由于一致的客户端请求(想像谷歌这样的东西会收到永无止境的请求)?
我意识到我可能误解了服务器如何处理客户端请求的基本方面。
【问题讨论】:
标签: javascript node.js express
据我了解,节点事件循环将继续处理请求,直到事件循环为空,此时它会查找事件队列以完成阻塞的 I/O 请求。
我的问题是.. 如果事件循环永远不会为空会发生什么?不是因为代码错误(即永无止境的循环),而是由于一致的客户端请求(想像谷歌这样的东西会收到永无止境的请求)?
我意识到我可能误解了服务器如何处理客户端请求的基本方面。
【问题讨论】:
标签: javascript node.js express
事件循环实际上有几个不同的阶段(定时器、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 之间的通信写得不好,很容易修复一次没有问题我意识到了问题所在。
【讨论】: