Nodejs 可以在单核处理器上使用异步和等待功能吗?

问题描述 投票:0回答:1

我刚刚了解了 node js 的内部工作方式。它实质上将阻塞操作(即异步任务)发送到线程池,其余任务保持等待。那么如果我们在单个核心应用程序上运行 nodejs 应用程序会发生什么?

再次强调,这只是我的思考过程,我可能是错的。我认为阻塞和非阻塞操作都将在同一个内核上执行。那么,这是否意味着应用程序在阻塞任务运行时可能没有响应?这是否意味着我们至少需要一个双核 CPU 来运行任何想要执行异步操作的 nodejs 应用程序?

node.js multithreading async-await blocking
1个回答
0
投票

Node.js 在单线程事件循环模型上运行,这意味着它一次处理一个操作。然而,这并不意味着它只能在多核机器上运行。它也可以在单核机器上完美运行。理解这一点的关键在于 Node.js 如何处理阻塞和非阻塞操作。

在 Node.js 中,读取文件、发出 HTTP 请求或查询数据库等 I/O 操作通常是异步执行的。当这些操作启动时,它们被移交给系统,释放 Node.js 以继续处理事件循环中的其他任务。当 I/O 操作完成时,回调函数被添加到事件队列中,以便稍后处理。

这并不一定意味着这些操作是在另一个线程或另一个内核中执行的。事实上,在很多情况下,这些操作是由操作系统或外部系统(如数据库)处理的,它们可以拥有独立于 Node.js 的多线程能力。

另一方面,CPU 绑定任务在 Node.js 中是阻塞的。这些操作确实在同一个线程中运行,并且会阻塞事件循环,导致应用程序变得无响应。如果您有一个 CPU 绑定任务需要在不阻塞事件循环的情况下运行,您可以使用 Node.js 的工作线程或子进程,如果它们可用,它们会使用额外的核心。

所以,为了回答你的问题,Node.js 应用程序可以在单核机器上运行,但如果你有 CPU 绑定的任务,你想并行运行,那么你将受益于多核机器。但是,请记住 Node.js 不是为 CPU 密集型任务设计的;它的优势在于处理许多并发 I/O 操作,这就是为什么它经常用于构建高并发服务器。

关于您标题中的问题,当异步函数正在等待 Promise 解决时,Node.js 可以继续处理事件循环中的其他任务。一旦 Promise 被解析,剩下的异步函数就可以执行了。

© www.soinside.com 2019 - 2024. All rights reserved.