当前位置: 首页 > 面试题库 >

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

松钊
2023-03-14
问题内容

在服务器端Javascript引擎的上下文中,什么是非阻塞I / O或异步I / O?我认为这是相对于Java服务器端实现的优势。


问题答案:

同步执行通常是指按顺序执行的代码。异步执行是指未按照代码中出现的顺序运行的执行。在以下示例中,同步操作导致警报按顺序触发。在异步操作中,虽然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,... 2
alert(1);
var value = localStorage.getItem('foo');
alert(2);

// Non-blocking: 1, 3,... 2
alert(1);
fetch('example.com').then(() => alert(2));
alert(3);

优点

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

同步阻塞示例

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

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

异步,非阻塞示例

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

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



 类似资料:
  • 实时的web特性通常需要为每个用户一个大部分时间都处于空闲的长连接. 在传统的同步web服务器中,这意味着需要给每个用户分配一个专用的线程,这样的开销是十分巨大的. 为了减小对于并发连接需要的开销,Tornado使用了一种单线程事件循环的方式. 这意味着所有应用程序代码都应该是异步和非阻塞的,因为在同一时刻只有一个操作是有效的. 异步和非阻塞这两个属于联系十分紧密而且通常交换使用,但是它们并不完全

  • 问题内容: 非阻塞TCP / IP S和在NIO帮我处理与小数目的线程许多TCP / IP连接。但是UDP 呢?(我必须承认我对UDP不太熟悉。) 即使UDP发送操作未在阻止模式下运行,它似乎也不会阻止。确实存在因拥堵或类似原因导致阻塞的情况吗?我真的很好奇,是否存在这样的情况以及生产环境中可能存在的情况。 如果实际上并没有阻塞,并且我不打算使用已连接并仅绑定到一个端口,那么使用非阻塞模式和and

  • 我正在使用Spring云平台开发微服务,其中service1调用多个其他微服务,例如service2、service3、Service4等。这些服务可以并行调用,service1将聚合结果。我能用春云伪装吗(http://cloud.spring.io/spring-cloud-static/Dalston.SR1/#spring-cloud Faign)生成rest客户端并异步调用服务,还是应该

  • 本文向大家介绍详解socket阻塞与非阻塞,同步与异步、I/O模型,包括了详解socket阻塞与非阻塞,同步与异步、I/O模型的使用技巧和注意事项,需要的朋友参考一下 socket阻塞与非阻塞,同步与异步 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就是在

  • 现在我们知道如何在一个指定I/O调度器上来调度一个任务,我们可以修改storeBitmap()函数并再次检查StrictMode的不合规做法。为了这个例子,我们可以在新的blockingStoreBitmap()函数中重排代码。 private static void blockingStoreBitmap(Context context, Bitmap bitmap, String filena

  • 我认为下面的流量链将通过事件循环放置/执行(像JS)。因此,运行下面的代码将首先打印阻塞循环&然后将执行通量链。 但是,整个通量总是先执行,然后才移动到循环。[我确实有一些语句正在阻塞。但是有两个阶段] 当我们使用reactor时,通过使用一些调度程序来实现异步/非阻塞行为的唯一方法? 如果我不使用任何调度器,并让代码使用当前线程执行,那么即使对于IO密集型应用程序,使用WebFlux而不是Spr