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