Node.js的阻塞与非阻塞、同步与异步是什么?
你可能已经听说Node.js是“基于Chrome的V8 JavaScript引擎的异步JavaScript运行的”,并且它“使用事件驱动的非阻塞I / O模型,使其轻量级和高效”。但对某些人来说,这不是最好的解释,或许太过于概念化。
首先要了解什么是Node.js?其次要知道Node.js究竟“异步”与“同步”有什么不同意思?还要讨论,“事件驱动”和“非阻塞”的含义是什么?
什么是Node.js
Node只是一个环境或运行时,可以在浏览器之外运行普通的JavaScript(略有不同)。
我们可以使用它来构建桌面应用程序(使用像Electron这样的框架),编写Web或app服务器等等。
阻塞/非阻塞和同步/异步
假设我们正在进行数据库调用以检索有关用户的属性,该调用需要时间,如果请求是“阻塞”,那么这意味着它将阻止我们的程序执行,直到调用完成。在这种情况下,我们发出了“同步”请求,它最终阻止了线程。
因此,同步操作会阻塞进程或线程,直到该操作完成,使线程处于“等待状态”。一个异步操作,在另一方面,是非阻塞的,它允许执行线程继续进行,无论操作完成所花费的时间或完成操作的结果如何,并且线程的任何部分都不会在任何时候进入等待状态。
让我们看一下阻塞线程的同步调用的另一个例子。假设我们正在构建一个应用程序,用于比较两个Weather API的结果,以找出它们的差异化。我们以阻塞的方式调用Weather API One并等待结果。得到结果后,我们调用Weather API Two并等待其结果。
请允许我个人指出一个问题:重要的是要认识到并非所有同步调用都必然是阻塞的。
如果同步操作可以设置完成而不阻塞线程或导致等待状态,则它是非阻塞的。大多数情况下,同步调用将被阻塞,完成所需的时间取决于多种因素,例如API服务器的速度,最终用户的互联网连接下载速度等。
对于上图,我们不得不等待一段时间才能从API One中检索第一批结果。此后,我们不得不等待同样的时间来获得API Two的回复。
在非阻塞调用的情况下,我们会有这样的事情:
你可以清楚地看到我们完成执行的速度有多快,而不是等待API One然后等待API Two,我们可以等待它们同时完成并将调用速度提高近50%。
因此请注意,一旦我们调用了API One并开始等待它的响应,我们也调用了API Two并开始等待它的同时响应它。
我们相信通过实验测试之后,相信很多人会更加了解阻塞,非阻塞,和同步,异步的使用。