为什么在NodeJS中需要异步编程?

时间:2019-05-17 09:57:35

标签: node.js asynchronous threadpool

我对NodeJS中async的概念有疑问。我已经阅读了很多有关NodeJS中事件轮询的信息。他们说:

  

事件循环使Node.js能够执行非阻塞I / O   操作

  

节点使用工作池来处理“昂贵”的任务。这包括   操作系统不提供非阻止功能的I / O   版本,以及特别占用CPU的任务。

  

这些是使用此工作程序池的Node模块API,例如   作为文件系统(fs)

因此,我发现Node使用线程池管理运行的I / O。现在我的问题是,如果Node正在管理它们,为什么我们需要在NodeJS中完全利用async programming?那么像 BlueBird 这样的模块背后的原因是什么?

1 个答案:

答案 0 :(得分:2)

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


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

  • 事件循环(或您的主线程)
  • 工人池(或线程池)

事件循环:

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

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

工人池

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

异步代码

为了防止阻塞主线程,您想保持事件循环的干净,并委派某些任务。这是需要异步代码的地方。这样,您的代码将成为非阻塞的。不过,关于异步和非阻塞的术语有点模糊。要澄清:

  • 异步代码:并行执行某些任务
  • 无阻塞:基本上可以轮询而不会阻塞其他代码。

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

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


BlueBird (或一般的承诺):

您不再需要像BlueBird这样的库,因为NodeJS支持开箱即用的承诺(请参见注释here)。

承诺只是编写异步代码的另一种方法。 Async/AwaitGenerator Functions也是如此。

旁注:用async关键字定义的函数实际上产生了一个承诺。