在Node.js中,“异步I/O基元”是什么意思?

5
我正在查阅Node.js的文档,但不理解其中一句话:
“一个Node.js应用程序在单个进程中运行,而不为每个请求创建新线程。Node.js在其标准库中提供了一组异步I/O原语,可以防止JavaScript代码被阻塞。通常情况下,Node.js库都是使用非阻塞范例编写的,使得阻塞行为成为例外而不是规范。”
来源: Node.js介绍 我不明白具体指什么:
“[...] Node.js在其标准库中提供了一组异步I/O原语,可以防止JavaScript代码被阻塞 [...]”
这是否意味着Node.js内置的功能可以提供异步工作的方式? 如果不是,那么这些异步I/O原语是什么?如果有任何人能够提供更好的理解Node.js或入门教程的链接,那将是非常棒的。
顺便说一下:我对Node.js有实际经验,我理解它的代码如何工作,但不理解为什么会这样工作,所以我希望了解它的理论部分,以便我可以理解背后的实际情况。
2个回答

5
它是指它具有内置功能,提供作为异步工作的机制吗?是的,基本上就是这个意思。在“传统”一线程每连接模型中,您接受连接,然后将该请求的处理移交给一个线程(无论是新启动的线程还是来自池中的线程,都没有太大变化),并在该线程上执行与该连接相关的所有工作,包括发送响应。这可以很容易地通过同步/阻塞 I/O 完成:具有简单返回读取字节的 read 方法和阻塞直到写入完成的 write 方法。然而,这意味着处理该请求的线程不能做任何其他事情,并且您需要许多线程才能处理许多并发连接/请求。由于 I/O 操作需要相对较长的时间(以计算机访问速度和计算方式测量时),这意味着这些线程中的大多数线程大部分时间都在等待一个或另一个 I/O 操作。具有异步 I/O 和事件为核心的架构意味着当启动 I/O 操作时,CPU 可立即进行下一个需要执行的操作,这可能与完全不同的请求相关。因此,可以在单个线程上处理更多的请求。原语只是意味着提供基本 I/O 操作,例如从网络连接或文件异步读取字节和写字节,并需要在其上构建基于这些操作的高级操作(再次以异步方式进行,以保持优势)。作为旁注:许多其他编程环境长期以来或最近几年已经具有异步 I/O API。使 Node.js 与众不同的是它是默认选项:如果您从套接字或文件读取内容,则异步进行是“正常”的,阻塞调用是例外。这意味着围绕 Node.js 的整个生态系统(即几乎所有第三方库)都以此为前提条件,并且也以相同的方式编写。因此,例如 Java 具有异步 I/O,但一旦使用任何仅支持阻塞 I/O 的 I/O 相关库,就会失去该优势。

非常棒的剖析。我从中学到了很多。谢谢。 - Nunchuk

0

这意味着Node.js在输入/输出操作上不会停止。假设您需要执行某个任务,并且它具有某些阻塞条件,例如如果按下空格键,则执行此操作,或者在esc键未按下时继续接受输入,因为Node.js是单线程的,这将停止所有操作并专注于执行阻塞条件工作,直到完成异步将允许应用程序在执行一个任务时不会停止其他任务,它将执行其他任务,直到该任务完成,这就是为什么我们在Node.js异步函数中使用await从承诺中获取值,当数据被处理时,指针将来到await行所在的行,并从中获取值或处理信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接