gpt4 book ai didi

node.js - 为什么 NodeJS 需要异步编程?

转载 作者:太空宇宙 更新时间:2023-11-03 23:15:19 24 4
gpt4 key购买 nike

我对 NodeJS 中的 async 概念有疑问。我读过很多关于 NodeJS 中事件轮询的内容。他们这样说:

The event loop is what allows Node.js to perform non-blocking I/O operations

Node uses the Worker Pool to handle "expensive" tasks. This includes I/O for which an operating system does not provide a non-blocking version, as well as particularly CPU-intensive tasks.

These are the Node module APIs that make use of this Worker Pool such as File System(fs)

所以,我发现 Node 使用线程池来管理 I/O 运行。现在我的问题是,如果 Node 正在管理它们,为什么我们需要在 NodeJS 中使用异步编程? BlueBird 等模块背后的原因是什么?

最佳答案

tl;dr:您需要async来防止事件循环阻塞。

<小时/>

NodeJS 使用一定数量的线程来处理客户端。基本上有两种类型的线程:

  • 事件循环(或您的主线程)
  • 工作池(或线程池)
<小时/>

事件循环:

基本上需要异步编程的原因:

注册所有事件后,NodeJS 进入事件循环并处理所有传入请求和传出响应。它们都通过事件循环。

工作池

正如您已经说过的,NodeJS 使用工作池来执行 I/O 和 CPU 密集型任务。

异步代码

为了防止阻塞主线程,您需要保持事件循环干净,并委托(delegate)某些任务。这就是需要异步代码的地方。这样你的代码就变得非阻塞了。不过,有关异步和非阻塞的术语有点模糊。澄清一下:

  • 异步代码:并行执行某些任务
  • 非阻塞:基本上是轮询而不阻塞进一步的代码。

然而,在 NodeJS 中,异步通常用于 I/O 操作。在那里,它不仅仅意味着“并行执行”,因为它主要意味着“不阻塞并获取信号”。

因此,为了使 NodeJS 的事件循环高效,我们不想等待操作完成。因此我们注册一个异步“监听器”。这使得 NodeJS 能够有效地管理自己的资源。

<小时/>

BlueBird(或一般的 Promise):

类似 BlueBird 的库您提到的不再需要,因为 NodeJS 支持开箱即用的 promise (请参阅注释 here )。

Promise 只是编写异步代码的另一种方式。 Async/Await也是如此和 Generator Functions

旁注:使用 async 关键字定义的函数实际上会产生一个 Promise。

关于node.js - 为什么 NodeJS 需要异步编程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56184015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com