Node.js中的非阻塞或异步IO是什么?

Node.js中的非阻塞或异步IO是什么?,第1张

Node.js中的非阻塞或异步I / O是什么? 同步与异步

同步执行通常是指按顺序执行的代码。异步执行是指未按照代码中出现的顺序运行的执行。在以下示例中,同步 *** 作导致警报按顺序触发。在异步 *** 作中,虽然

alert(2)
似乎执行第二次,但不是。

同步:1,2,3

alert(1);alert(2);alert(3);

异步:1,3,2

alert(1);setTimeout(() => alert(2), 0);alert(3);
阻塞与非阻塞

阻塞是指阻塞进一步执行直到该 *** 作完成的 *** 作。非阻塞是指不阻塞执行的代码。在给定的示例中,

localStorage
是一个阻塞 *** 作,因为它使执行停止进行读取。另一方面,
fetch
是非阻塞 *** 作,因为它不会
alert(3)
因执行而停顿。

// Blocking: 1,... 2alert(1);var value = localStorage.getItem('foo');alert(2);// Non-blocking: 1, 3,... 2alert(1);fetch('example.com').then(() => alert(2));alert(3);
优点

非阻塞异步 *** 作的一个优势是,您可以最大限度地利用单个CPU和内存。

同步阻塞示例

同步阻塞 *** 作的一个示例是某些Web服务器(如Java或PHP中的Web服务器)如​​何处理IO或网络请求。如果您的代码从文件或数据库中读取,则代码“阻止”执行后的所有内容。在这段时间里,您的计算机占用了
不执行任何 *** 作 的线程的内存和处理时间。

为了在该线程停止运行时满足其他请求,取决于您的软件。大多数服务器软件所做的就是生成更多线程来满足其他请求。这需要更多的内存消耗和更多的处理。

异步,非阻塞示例

异步,非阻塞服务器(如Node中制造的服务器)仅使用一个线程来服务所有请求。这意味着Node实例可以充分利用单个线程。创建者在设计时以I /
O和网络 *** 作为瓶颈。

当请求到达服务器时,将一次为它们提供服务。但是,例如,当所服务的代码需要查询数据库时,它会将回调发送到第二个队列 ,并且主线程将继续运行
(它不等待)。现在,当数据库 *** 作完成并返回时,相应的回调从第二个队列中退出,并在第三个队列中排队等待执行。当引擎有机会执行其他 *** 作时(例如清空执行栈时),它将从第三个队列中选择一个回调并执行它。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4988676.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存