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

标签 node.js asynchronous threadpool

我对 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/

相关文章:

java - 使用线程池查询远程数据库

java - PriorityBlockingQueue 按 boolean 比较排序

Node.js "passport-google-oauth2"在 Express 应用程序中提供 "failed to fetch user profile"错误

javascript - 如何在 javascript 中检测给定一维数组中的峰值?

c# - 即使我的服务器套接字已收到所有字节,为什么 SendAsync 不会在 SocketAsyncEventArgs 上引发 Completed 事件?

javascript - 如何从异步调用返回响应?

javascript - 多个异步回调 - 使用数组在完成时触发函数

java - 即使使用线程池,多线程时许多短期任务也会变慢

javascript - HTTP post 请求与 DB 请求不同步

javascript - 如何为 View 提供子字符串对象? Express.js