【发布时间】:2020-09-16 15:26:15
【问题描述】:
为了深入了解有关 Node.js 的更复杂概念,我正在做一些研究,以确保我了解有关该语言的原则及其构建的基本构建块。
就我而言,Node.js 依赖 反应器模式 来处理每个传入的请求。该算法基于 Event Demultiplexer 算法。第二个负责处理请求操作及其资源,然后,一旦操作完成,它将“结果”添加到事件队列。在此过程之后,Event Loop 现在负责执行每个事件的处理程序。
作为一个单线程进程,如果事件循环并行管理所有事件队列任务,我很难理解事件多路分解器如何处理所有传入操作...
我在Node.js documentation 中找到了这个:
由于大多数现代内核都是多线程的,它们可以处理多个 在后台执行的操作。当这些操作之一 完成后,内核告诉 Node.js 以便适当的回调 可能会被添加到轮询队列中以最终被执行。好吧 稍后在本主题中进一步详细解释这一点。
这是否意味着 Node 不处理 Event Demultiplexer 任务并且 Node 只是获取结果以便将其添加到事件队列中?这不是说 Node 不是单线程的吗?
我在网上找到了一些有用的图表,它们清楚地解释了每个请求所遵循的路径,但是真的很难找到一些解释线程处理每个请求的实际时间的图表。
【问题讨论】:
-
通常,每个执行上下文有一个事件循环。为了利用多个 CPU 内核,cluster 模块用于分叉额外的处理循环。此外,节点在用户代码中是单线程的。每当你调用一个库函数时,它的内部可以做任何事情,甚至产生线程,只要将结果放回由你的用户代码单线程处理的事件循环中。
-
我发现这个谈话真的很有帮助,以防有人感兴趣youtu.be/zphcsoSJMvM
标签: javascript node.js event-loop libuv principles