【发布时间】:2023-04-05 21:35:01
【问题描述】:
我正在阅读一本 Node.js 的书,试图清楚地了解 Node.js 如何处理事件、异步函数及其回调、非阻塞 I/O 等。以下是我如何处理的简要提要了解 事件循环 基础知识,然后,一些我无法在书中找到明确答案的问题。如果我的基本理解有任何错误,请纠正我。然后问题接踵而至。
据我了解,Node.js 在单个线程上运行所有功能。这包括事件循环。换句话说,当一个事件发生时,例如HTTP 请求,该请求进入事件队列。事件循环本身一次从队列中拉出一个事件并对其进行整体处理。这可能意味着立即返回一个简单的结果,或者在 I/O 到第三方(如数据库或文件系统)的情况下,进行非阻塞、异步调用,并通过回调告诉系统何时该做什么异步功能完成。同时,队列中的所有其他事件都在等待。如果开发人员编写的方法不会异步或将工作卸载给工作人员,则在处理任务时整个服务器将挂起。
如果其中有任何错误,请澄清,因为这可能会影响我对以下问题的答案的理解,我希望这些问题不会太愚蠢。
- 文件系统、数据库和其他此类调用不会阻塞,因为 Node.js 将它们卸载到异步调用,但如果 Node.js 是单线程的,谁在监听新事件并管理事件循环?当 Node.js 正在处理一些事件时,谁在监听和管理新传入事件的队列,以便在 Node.js 的注意力在别处时不会丢失它们?我是否从根本上误解了这是如何工作的?除了运行我们代码的引擎部分之外,是否有像守护程序在运行之类的东西来管理事件队列?
- 异步函数回调的类似问题......当 Node.js 已经在处理一些回调或事件时,谁在监听和管理传入的回调,以便回调在处理过程中不会因为到达而丢失?李>
- 当异步函数完成时,回调是中断事件循环并立即进行控制,还是异步函数的返回作为队列末尾的新事件重新进入事件循环并等待轮到自己再次?换句话说,来自异步函数的回调是像任何其他事件一样处理,还是不同?如果区别对待,如何处理?这是一个根本愚蠢的问题吗?
- 回调是否可以阻塞,就像写得不好的事件处理程序(例如 HTTP 请求处理程序)一样?换句话说,回调中包含的写得不好的代码会阻塞服务器吗? (我认为答案是肯定的,但想知道我是否正确。)
这是一个类似的问题,答案很好,但细微差别略有不同。这个链接的问题解决了与用户代码有关的异步问题,但其中一个答案似乎包含对我的问题的偶然答案。我对用户从不与之交互的 Node 的内部工作也很感兴趣,例如谁在 Node 阻塞时管理新的客户端请求插入到事件队列中,对于回调等也是如此。 Is NodeJS really Single-Threaded?
【问题讨论】:
标签: javascript node.js asynchronous nonblocking