【问题标题】:What does it mean by " asynchronous I/O primitives" in nodejs?nodejs中的“异步I/O原语”是什么意思?
【发布时间】:2021-05-19 10:48:12
【问题描述】:

我正在浏览 Node.js 文档,但无法理解该行:

Node.js 应用程序在单个进程中运行,无需为每个请求创建新线程。 Node.js 在其标准库中提供了一组异步 I/O 原语,可防止 JavaScript 代码阻塞,通常,Node.js 中的库是使用非阻塞范例编写的,使阻塞行为成为例外而不是常态。

来源:Introduction to node js

具体看不懂:

[...] Node.js 在其标准库中提供了一组异步 I/O 原语,可防止 JavaScript 代码阻塞 [..]

这是否仅仅意味着,它具有提供异步工作的规定的内置功能? 如果不是,那么这些异步 I/O 原语集是什么?如果有人可以为我提供一些链接以便更好地理解或开始使用 Node.js,那就太好了。

P.S:我有 Nodejs 的实践经验,我了解它的代码是如何工作的,但不明白它为什么会工作,所以我想了解它的理论部分,这样我才能了解后台实际发生的事情。

【问题讨论】:

    标签: node.js


    【解决方案1】:

    这是否仅仅意味着,它具有提供异步工作的规定的内置功能?

    是的,基本上就是这个意思。

    在“传统”每个连接一个线程* 模型中,您接受一个连接,然后将该请求的处理交给一个线程(新启动的线程或来自池的线程) ,实际上并没有太大变化)并在该线程上完成与该连接相关的所有工作,包括发送响应。

    这可以通过同步/阻塞 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 相关库,您就会失去该优势。

    * 我在这个答案中交替使用连接/请求,假设每个连接都包含一个请求。如今,这种假设通常是错误的(大多数常见协议允许在单个连接中出现多个请求/响应对),但在单个连接上处理多个请求并不会从根本上改变这个答案。

    【讨论】:

    • 惊人的崩溃。我从中学到了很多。谢谢。
    【解决方案2】:

    这意味着 node js 不会在输入/输出操作时停止。假设您需要执行一些任务并且它有一些阻塞条件,例如如果按下空格键然后执行此操作,或者在未按下 esc 键时继续输入,因为节点 js 是单线程的,这将停止所有操作,它将专注于做阻塞条件作业直到它完成它异步将允许应用程序在执行一个任务时不会暂停其他任务,它将执行其他任务直到任务完成,这就是为什么 我们使用等待从节点 js 异步函数中的承诺中获取价值 处理完数据后,指针将到达等待行所在的行,并从中获取值或处理信息。

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 2013-04-05
      • 1970-01-01
      • 2011-01-14
      • 2021-09-18
      • 2016-02-20
      • 2011-10-22
      • 1970-01-01
      • 2012-05-21
      相关资源
      最近更新 更多