了解 NodeJS 和非阻塞 IO

2024-02-19

所以,我最近被注射了 Node 病毒,该病毒在编程世界中传播得非常快。

我对它的“非阻塞 IO”方法着迷,并且自己也确实尝试了几个程序。

但是,我目前无法理解某些概念。

我需要外行人的回答(来自 Java 背景的人)

1. 多线程和非阻塞IO。

让我们考虑一个实际场景。比如说,我们有一个用户可以注册的网站。下面是代码。

..
..
   // Read HTTP Parameters
   // Do some Database work
   // Do some file work
   // Return a confirmation message
..
..

在传统的编程语言中,上述过程是按顺序发生的。并且,如果有多个注册请求,Web 服务器会创建一个新线程,其余的都是历史记录。当然,程序员可以创建自己的线程来同时在第 2 行和第 3 行上工作。

据我了解,在 Node 中,第 2 行和第 3 行将并行运行,而程序的其余部分将被执行,并且解释器每“x”毫秒轮询第 2 行和第 3 行。

现在,我的问题是,如果 Node 是单线程语言,那么在执行程序的其余部分时,第 2 行和第 3 行的工作是什么?

2. 可扩展性

我最近了解到 LinkedIn 已经采用 Node 作为其移动应用程序的后端,并且已经看到了巨大的改进。

谁能解释一下它是如何产生如此大的差异的?

3.其他编程语言的适配

如果人们声称 Node 在性能方面有很大的不同,为什么其他编程语言没有采用这种非阻塞 IO 范例呢?

我确信我错过了一些东西。只有您能解释我并通过一些链接指导我,才会有帮助。

Thanks.


有人提出了类似的问题,并且可能包含您正在寻找的所有信息:单线程非阻塞 IO 模型在 Node.js 中的工作原理 https://stackoverflow.com/questions/14795145/how-the-single-threaded-non-blocking-io-model-works-in-node-js

但我将简要介绍您的三个部分:

1.
第 2 行和第 3 行的非常简单的形式可能如下所示:
db.query(..., 函数(query_data) { ... });
fs.readFile('/path/to/file', function(file_data) { ... });

现在函数(query_data)和函数(file_data)是回调。函数 db.query 和 fs.readFile 将发送实际的 I/O 请求,但回调允许延迟处理来自数据库或文件的数据,直到收到响应为止。它并不是真正的“民意调查第 2 行和第 3 行”。回调被添加到事件循环中,并与各自 I/O 事件的一些文件描述符相关联。然后它会轮询文件描述符以查看它们是否准备好执行 I/O。如果是,它将使用 I/O 数据执行回调函数。

我认为“除了你的代码之外,一切都是并行运行的”这句话很好地总结了这一点。例如,“读取 HTTP 参数”之类的内容将按顺序执行,但第 2 行和第 3 行中的 I/O 函数与添加到事件循环并稍后执行的回调相关联。所以基本上要点是它不必等待 I/O.

2.
由于 1. 中解释的内容,Node 可以很好地扩展I/O 密集型请求并允许许多用户同时连接。它是单线程的,因此对于 CPU 密集型任务来说不一定能够很好地扩展。

3.
这种范例已与 JavaScript 一起使用,因为 JavaScript 支持回调、事件循环和闭包,这使得这一切变得容易。这在其他语言中不一定成立。

我可能有点偏离,但这就是正在发生的事情的要点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 NodeJS 和非阻塞 IO 的相关文章

  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 如何正确配置Tomcat SSLHostConfig?

    我正在按照本教程在 tomcat 中启用 ssl https medium com raupach how to install lets encrypt with tomcat 3db8a469e3d2 https medium com
  • 我们可以在三元运算符(Java)中使用命令吗?

    这是一个工作代码 String a first String b second String object System out println object null a b 但它不是 String a first String b se
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • 如何验证最终用户经过身份验证的令牌(使用 Firebase 身份验证)来调用 google cloud run 端点?

    请帮助使用 firebase 身份验证在云运行中进行最终用户身份验证 简短的介绍 我从 firebase 函数提交 Authorization Bearer idToken 标头 并使用电子邮件 密码 firebase 用户进行身份验证的
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • JSP 标签+ scriptlet。如何启用脚本?

    我有一个使用标签模板的页面 我的 web xml 非常基本 我只是想在页面中运行一些代码 不 我对标签或其他替代品不感兴趣 我想使用不好的做法 scriptlet 哈哈 到目前为止 我收到了 HTTP ERROR 500 错误 Script
  • 如何自定义JProgressBar?

    我正在制作一个启动器 我想要一个自定义的进度栏 我已经做了一些研究 并且可以使用 JavaFX 从未用它做过任何事情 并且可以通过替换 UI 来实现 我正在寻找一个具有圆形边缘和圆形填充的酒吧 像这样的事情 package gui impo
  • 使用 WebSocket 是否会产生服务器成本?

    我已经离开了 PHP MySQL 的舒适区 因为语法 封装 过程的东西可能会让人沮丧 上周 我开始尝试并按照一些教程使用 Node js Socket IO 创建实时聊天应用程序 到目前为止 我从未使用过 WebSockets 做过任何事情
  • 从 bash 脚本运行节点

    很简单 我正在尝试使用 cron 自动运行 nodejs 脚本 但是脚本本身似乎无法运行该文件 我的脚本很简单 usr bin env node node var node assets js update js 但是 在运行此命令时 它返
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • 无法安装js-bson

    我正在使用Windows 7 64位 尝试安装bson作为mongodb的依赖项 我收到此错误 npm WARN package json email protected cdn cgi l email protection No READ
  • 如果 node_modules 目录存在,Azure 模拟器无法启动 Web 角色

    我想我只是偶然发现了一个非常奇怪的问题 我有一个相当大的解决方案 包括一个具有 3 个角色 两个工作角色和一个 Web 角色的 Azure 项目 Web角色基于asp net mvc和web api 昨天尝试 gulp 用于编译和捆绑较少的
  • 字节码和位码有什么区别[重复]

    这个问题在这里已经有答案了 可能的重复 LLVM 和 java 字节码有什么区别 https stackoverflow com questions 454720 what are the differences between llvm
  • 哪种 Java DOM 包装器是最好或最受欢迎的? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • 为什么在尝试使用 Java 连接到 RDS PostgreSQL 数据库时会收到 SocketTimeoutException?

    我有一个 Spring 应用程序 我试图在 AWS 上托管 几天来我一直在努力配置 我有一个 EC2 实例 并且能够通过 SSH 连接到它 我还在 AWS 中设置了 Postgres RDS 数据库 但我无法使用 IDE 中的代码连接到它
  • 使用 Maven 3 时 Cobertura 代码覆盖率为 0%

    读完这篇文章后 将 Cobertura 与 Maven 3 0 2 一起使用的正确方法是什么 https stackoverflow com questions 6931360 what is the proper way to use c
  • 如何在Java中跨类共享变量,我尝试了静态不起作用

    类 Testclass1 有一个变量 有一些执行会改变变量的值 现在在同一个包中有类 Testclass2 我将如何访问 Testclass2 中变量的更新值 由 Testclass1 更新 试过这个没用 注意 Testclass1和Tes

随机推荐

  • jQuery AJAX 没有错误或成功触发

    我有一个简单的联系表格 然后我就可以从中发布 我正在尝试使用 jQuery AJAX 数据 但由于某种原因 我没有收到处理程序的任何响应 这段代码正确吗 document on ready function contactButton on
  • UITableView titleForHeaderInSection 显示全部大写

    我正在使用 titleForHeaderInSection 显示 UITableView 部分的标题 它在 iOS6 SDK 中工作得很好 但 iOS7 SDK 显示的标题全部大写 我猜这是苹果更新的人机界面指南的一部分 那里的所有示例都显
  • Oracle Merge 删除子句其中数据在目标中但不在源中

    尝试从目标表中删除源表中不存在的记录 对象类型 CREATE OR REPLACE type dbo P REC AS OBJECT ATTR1 VARCHAR2 64 BYTE ATTR2 VARCHAR2 128 BYTE ATTR3
  • Tkinter - 如何将实例变量传递给另一个类?

    我用谷歌搜索了很多 但没有成功 上周发布了一个问题 但没有答案 因为似乎太长了 希望新问题更加清晰 这只是一小段代码 如果您运行它 您将能够重现该问题 我基本上需要做的是获取用户输入 来自 mainGUI 类的 E1 并将其传递给数据库类中
  • Firebase 数据库中“加载文档时出错”

    我在尝试访问时遇到错误Database内的菜单项Firebase 控制台 这是一个新的数据库 实际上有几条数据记录 但屏幕一直旋转很长时间 然后返回消息 加载文档时出错 同时我可以访问验证菜单项没有任何问题 Note 我使用的是配备 Cat
  • yii 执行自定义命令时出错

    当我运行自定义时 出现以下错误yiic终端中的命令 我似乎无法找出此错误的原因 任何人都可以指出我正确的方向 我知道数据库工作正常 应用程序的其他部分工作正常
  • 这段简单的代码的复杂性是多少?

    I m pasting this text from an ebook I have It says the complexity if O n2 and also gives an explanation for it but I fai
  • XSLT:没有属​​性且没有子元素的元素转换为父属性

    给定 xml 文件的结构 名称和值未知 对于每个具有简单结构 没有子节点 没有属性 但有文本且不为空 的非根元素 将其转换为父级的属性 我有 xml 文件
  • 房间和可用日期 PHP/MySQL

    因此 我正在设计一个适用于酒店的 Web 应用程序 它最终应该成为通过一些额外代码为每个酒店网站安装的简单方法 该应用程序是使用 php 和 mysql 因此 正如您可能猜到的那样 我对数据库结构非常困惑 不过 我做了一些研究 我不仅仅是要
  • Git clean 被忽略的文件夹

    我有一个文件夹foo包含在 gitignore 中 gitignore this contains foo foo bar 当我跑步时git clean f or git clean f x 这不会删除bar bar是一个普通文件 有没有办
  • boto3.Bucket.upload_file 是阻塞还是非阻塞?

    Is boto3 Bucket upload file http boto3 readthedocs io en latest reference services s3 html S3 Bucket upload file阻塞还是非阻塞
  • 插入多对多关系表

    简单场景 ClientTable ClientId ClientName Phone Age CityTable CityID CityName Country ClientCityTable ClientCityID ClientID C
  • 如何在 html 文本区域中显示以下文本?

    我有一个如下所示的字符串 请看一下 我把它作为图像 这里也不显示 如果我将该字符串放在这里 它就会变成以下内容 21154537878887GHE u0044 u0045 现在我的问题是 有没有办法将原始字符串放入 HTML 中
  • 有什么方法可以从 lme4 mer 模型拟合对象生成 LaTeX 表吗?

    有谁知道如何从 lme4 生成一个好的出版质量的 LaTeX 表mer目的 既没有xtable方法 包xtable 也不latex方法 包Hmisc 知道如何处理mer对象 例如 考虑到这种拟合 library lme4 fm1 lt lm
  • 如何更改 Rails 应用程序数据?

    我看过很多关于 ActiveRecord 迁移以及是否应该使用它们来更改应用程序中的数据的讨论 有些人说是 有些人说不 我的问题是 如果您不使用迁移来执行此操作 那么您使用什么 只是你写的另一个脚本 我正在寻求有关替代方法的建议 以及为什么
  • 观察 Linux 内核中的变量(内存地址)变化,并在变化时打印堆栈跟踪?

    我想以某种方式 监视 Linux 内核 确切地说是内核模块 驱动程序 中的变量 或者内存地址 并找出改变它的原因 基本上 当变量改变时打印出堆栈跟踪 例如 在内核模块中testjiffy hr c列于末尾这个答案 https stackov
  • 如何访问在单独的 Web 应用程序中实现远程接口的 EJB?

    我正在使用 Netbeans 6 8 和 Glassfish v3 0 我创建了一个 ejb 模块并从数据库创建了实体类 然后创建了具有远程接口的无状态会话 bean 比如说 Remote public interface customer
  • 是否可以在 GHCi 中定义新的 ADT

    在评论 ghci 的新功能时 我希望 ghci 能够声明类型声明并声明新的 ADT 类型 有人告知这确实是可能的 经过搜索我发现这一页 https stackoverflow com questions 3093133 how to pro
  • ASP.NET Core - 从智能手机远程访问

    我尝试通过计算机的 IP 地址配置对 ASP NET Core 应用程序的访问 每当我尝试通过智能手机访问网站时 都会收到错误消息ERR CONNECTION TIMED OUT 我完全按照 Stack Overflow 上许多类似问题 答
  • 了解 NodeJS 和非阻塞 IO

    所以 我最近被注射了 Node 病毒 该病毒在编程世界中传播得非常快 我对它的 非阻塞 IO 方法着迷 并且自己也确实尝试了几个程序 但是 我目前无法理解某些概念 我需要外行人的回答 来自 Java 背景的人 1 多线程和非阻塞IO 让我们