Nodejs 中的非阻塞I/O、异步和事件驱动

2023-11-04

前言

Node.js使用 事件驱动机制、具有非阻塞的I/O模型这样的特点,Node.js中的大多数Api都用到了异步函数,那麽又该如何获取异步函数返回的数据呐!废话不多说,来看看本次分享 都有哪些亮点吧!

一、Nodejs 的 非阻塞 I/O 异步 事件驱动

关键词:非阻塞I/O、事件驱动

1. 非阻塞I/O

  • 在 Java、 PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。 而每个线程需要耗费大约 2MB 内存。也就是说,理论上,一个 8GB 内存的服务器可以同时 连接的最大用户数为 4000 个左右。要让 Web 应用程序支持更多的用户,就需要增加服务器 的数量,而 Web 应用程序的硬件成本当然就上升了。

  • Node.js 不为每个客户连接创建一个新的线程, 而仅仅使用一个线程。当有用户连接了, 就触发一个内部事件,通过非阻塞 I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。 使用 Node.js,一个 8GB 内存的服务器,可以同时处理超过 4 万用户.

2. Nodejs 回调处理异步

错误的写法:

function getData(){
    //模拟请求数据

    var result='';

    setTimeout(function(){

        result='这是请求到的数据'

    },200);

    return result;
}
console.log(getData());/*异步导致请求不到数据*/

正确的处理异步:

function getData(callback){
    //模拟请求数据

    var result='';

    setTimeout(function(){

        result='这是请求到的数据';

        callback(result);

    },200);
}
getData(function(data){

    console.log(data);
})

3、 Nodejs events 模块处理异步

Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件

// 引入 events 模块

var events = require('events');

var EventEmitter=new events.EventEmitter(); /*实例化事件对象*/

EventEmitter.on('toparent',function(){
    console.log('接收到了广播事件');
})

setTimeout(function(){
    console.log('广播');

    EventEmitter.emit('toparent'); /*发送广播*/
},1000)

结语

OK,这次关于Node.js的分享 到这就结束了,希望能帮助刚入门的小白

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

Nodejs 中的非阻塞I/O、异步和事件驱动 的相关文章

  • 客户端 GitHub 身份验证

    我正在使用 Javascript 对 GitHub 进行基本身份验证 例如 以下 shell 命令从 Github 获取令牌 curl i u uaername password k d scopes repo https api gith
  • 在 TFS 上构建想要从 Node.js 测试项目复制可执行文件

    我使用 Node js 工具为量角器测试环境创建了一个 Node js 项目 以在 Team Foundation 服务器上测试 Web 应用程序 我可以在本地创建测试项目并使用调试器运行它 但是 TFS 上的构建不起作用 Log
  • 如何使用 html 标签包装 window.getSelection().getRangeAt(0) 中的文本选择?

    如何从 window getSelection getRangeAt 0 中进行选择并用 HTML 标签 例如 span 或 mark 包围它 我更喜欢直接的 javascript 或 jQuery 解决方案 我可以使用警报输出选定的文本
  • 如何捕获jquery中的任何点击事件[重复]

    这个问题在这里已经有答案了 我有一个按钮 当单击它时 会显示一个带有图像的 div 例如聊天的表情符号面板 如果我再次单击它 div 会隐藏 但我想要做的是 如果 div 已经显示 然后我单击页面的任何其他内容 我想隐藏它 我试过这个 my
  • RSA Java 加密和 Node.js 解密不起作用

    我有一个系统 需要在 javascript 中生成 RSA 密钥对 然后将公钥存储在服务器端的数据库中 作为字符串 然后 Java 中的服务器端将使用存储的公钥对字符串进行加密密钥并将其发送到客户端 客户端将使用私钥解密该字符串 我在客户端
  • 如何使用React Native在屏幕上绘图?

    我正在尝试在 React Native 中实现一个 Android 绘图应用程序 我正在使用 PanResponder 但我不知道如何获取用户触摸的部分的坐标 我尝试过使用react native svg但我不知道该放在哪里PanRespo
  • jQuery:“$(this).next().next()”有效,但“$(this).next('.div')”无效

    好吧 我正在尝试将这组信息单独隐藏 这有效 arrow click function this next next slideToggle img class arrow src https via placeholder com 40 h
  • 在 Javascript 中隐藏按钮

    在我最新的程序中 有一个按钮 单击时会显示一些输入弹出框 这些框消失后 如何隐藏按钮 You can set its visibility财产 http www w3schools com cssref pr class visibilit
  • `forEach` 函数中的 `return` 关键字是什么意思? [复制]

    这个问题在这里已经有答案了 button click function 1 2 3 4 5 forEach function n if n 3 it should break out here and doesn t alert anyth
  • 在 json 对象中执行 javascript 代码?

    有远吗 所以像这样 key1 val1 key2 val2 some code document getElementById someid innerHTML test 那么 some code 会在没有任何用户干预的情况下执行吗 No
  • 如何在传单地图上显示热图

    我想在我的传单地图上显示热图 我使用了 heatmap jshttps github com pa7 heatmap js https github com pa7 heatmap js但它最终只是显示 未捕获的类型错误 无法分配给只读属性
  • 提交外部有 INPUT 的表单,并修改值后

    我有一个form 有几个
  • 从数组中删除空字符串,同时保持记录而不循环?

    这个问题在这里被问到 从数组中删除空字符串 同时保留非空字符串的索引记录 https stackoverflow com questions 18113243 remove empty strings from array while ke
  • 如何使用javascript将数据存储在xml文件中?

    我是 javascript 新手 并在我的项目中使用它 因为我需要读取 xml 文件 然后在操作后我想将更新后的值存储回 xml 文件中 我成功从 xml 文件获取值 但无法存储值返回到 xml 文件 这是我尝试过的代码
  • 从组件刷新/重新加载 ember 路由

    我有一个组件 它实际上是一个模式对话框 当我完成该对话框并按 确定 按钮时 我想留在打开该对话框的停留页面上 这并不难 但问题是该对话框更改了数据 我通过 REST 调用获取数据 因此我需要刷新已经所在的路线以反映数据更改 因为我是从组件中
  • 过滤数据表中的行

    我目前的 JQuery 插件 DataTables 工作正常 并且我在页面顶部插入了一个按钮来进一步过滤列表 我还使用了 DataTables 内置的搜索栏 我希望按钮向下过滤表格 并只显示包含特定值的行 下面是我一直在做的事情 但似乎没有
  • 在 Nodejs、pg-promise 中重建连接

    在使用建立主 副本 postgres 连接的场景中pg promise 有没有办法在副本中断的情况下重建这些连接 而不是做process exitCode 1 在通过 initOptions 传递的错误函数中 并在服务启动时仅重建工作连接
  • 如何阻止我的 App Engine 应用程序的“appspot.com”?

    我添加了一个自定义域 并将其添加到 App Engine 例如 假设我的自定义域是 example com 我的应用程序由 Node js 提供服务 当我通过 App Engine 部署我的应用程序时 它会向我提供以下地址来访问它 exam
  • 将json数据从servlet传递到jsp到js文件

    我得到了这个创建 JSON 数据的 servlet 我想将此数据传递到一个 jsp 页面 该页面应该通过 InfoVis 工具包显示数据 servlet java JSONObject json new JSONObject JSONArr
  • 如何从索引文件迭代多个导入的模块

    我有一个名为Polygons我在那里创建了一个index jsfile 以导出目录中的所有文件 它看起来像这样 export default as europe from europe export default as northAmer

随机推荐

  • C语言:二进制、八进制、十六进制整数的书写及输出

    目录 一 整型数据类型 二 二进制 八进制 十六进制的书写 1 二进制 以 0b 0B 开头 不区分大小写 数字0 而非字母o 下同 2 八进制 以数字 0 开头 3 十六进制 以 0x 0X 开头 三 二进制 八进制和十六进制的输出 八进
  • make update-api 的由来

    谷歌对于所有的类和API 分为开放和非开放两种 当我们修改framework目录中的java文件时 比如添加API 删除API 声明变量 编译器都需要我们决定API是开放还是非开放 对于开放的类和API 可以通过 Javadoc标签 与源码
  • HTML与CSS详细介绍

    HTML 与 CSS 1 主要内容 2 HTML HTML HyperText Markup Language 就是超 本标记语 超 本 就是表示 内可以包含 字元素 如 图 链接 乐等等 它是 种建 件的语 通过标记式的指令 Tag 将影
  • excel修改服务器名称,云服务器 修改Excel

    云服务器 修改Excel 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 本节操作介绍Linux云服务器切换密钥登录为密码
  • Ubuntu默认的dash带来的问题

    Ubuntu默认dash带来的问题 前述 在这篇文章开始之前 如果不知道什么是dash或者dash与bash的区别是什么 我们可以先轻松的浏览一下小编的前一篇文章 小编不敢保证我们看了之后就对bash dash了解透彻 但是小编认为阅后对b
  • Eclipse安装SpringBoot插件

    写在前面 接触SpringBoot已经很久了 习惯使用的开发工具是IDEA 今天突然想使用Eclipse来跑一个SpringBoot项目 但是在导入项目是无法启动 意识到 eclipse默认是没有SpringBoot项目的插件的 所以自己手
  • 抖音泛知识交易系统2.0 pay-button 交易按钮

    说明 以下方法是使用Hbuilder建立的项目 由于pay button是新增组件 框架暂未适配 因此需要使用原生组件混合的方式接入 使用Hbuilder新建项目之后 1 在根目录新建vue config js文件 vue config j
  • 代码走查

    转载 http forthtiger spaces live com Blog cns 95D3AD656DAA820A 175 entry b 为什么要执行代码走查 什么时候执行代码走查 如何有效执行代码走查 b 一般的看法 认为代码走查
  • C++数据类型(整型、浮点型、字符型、字符串型、布尔型)

    文章目录 1 整型 2 sizeof关键字 3 浮点型 实型 4 字符型 5 转义字符 6 字符串型 7 布尔类型 bool 8 C 数据类型小结 9 数据的输入 C 创建变量或常量时 必须指定数据类型 否则无法为变量分配内存 数据类型的意
  • 人工智能与机器学习著名会议

    转自论坛http www ieee org cn dispbbs asp BoardID 62 replyID 31567 id 29962 star 1 skin 0 作者好像是南大周志华老师 我知道的几个人工智能会议 一流 下面同分的按
  • 【华为OD机试真题 JAVA】字符串分割(二)

    JS版 华为OD机试真题 JS 字符串分割 二 标题 字符串分割 时间限制 1秒 内存限制 262144K 语言限制 不限 给定一个非空字符串S 其被N个 分隔成N 1的子串 给定正整数K 要求除第一个子串外 其余的子串每K个字符组成新的子
  • element ui 前台模板_一个干净优雅的Element UI Admin模板

    Element UI Admin 一个干净优雅的Element UI Admin模板 一个大型单页应用离不开合理的项目结构和一些简单的封装 Start 克隆或者下载这个仓库 进入项目目录安装依赖 yarn Develop serve wit
  • python:基于朴素贝叶斯算法的垃圾邮件过滤分类

    目录 一 朴素贝叶斯算法 1 概述 2 推导过程 二 实现垃圾邮件过滤分类 1 垃圾邮件问题背景 2 朴素贝叶斯算法实现垃圾邮件分类的步骤 3 python实现 参考学习网址 https blog csdn net weixin 59450
  • Nacos适配Oracle12c【亲测可用、保姆级教学】

    Nacos适配Oracle12c 前言 内容准备 数据SQL 源码项目 项目初始化 提取Nacos启动包 启动Nacos 尝试访问 其他问题 IDEA 报错找不到符号com alibaba nacos consistency entity
  • 华为OD机试 - 字符串加密(C++ & Java & JS & Python)

    描述 有一种技巧可以对数据进行加密 它使用一个单词作为它的密匙 下面是它的工作原理 首先 选择一个单词作为密匙 如TRAILBLAZERS 如果单词中包含有重复的字母 只保留第1个 将所得结果作为新字母表开头 并将新建立的字母表中未出现的字
  • 局域网IP地址不够用怎么办?快速解决局域网IP地址不够用

    目录 前言 设置局域网的IP地址数量 1 LAN地址设置 2 DHCP服务器设置 增加路由器层级或者使用软路由 通过三层交换机实现VLAN 总结 前言 在网络如此发达的时代 越来越多的设备需要连接网络 特别是当前智能家居 物联网的新型产业的
  • Maven 编译遇到 Process terminated【四种情况全部解决】

    情况一 配置文件 settings xml 出错 解决方法1 1 1 项目编译报错如下 1 2 点击 项目名 提示找到出错文件 1 3 点击查看出错文件 在idea中打开了settings文件 找到提示的报错位置 1 4 原因及解决办法 原
  • Altium中网络标签、端口、离图以及编译范围的设置区别?

    1 Altium Designer多图纸功能 原理图主次分层次 Altium Designer多图纸功能 原理图主次分层次 1 1 各类网络标识符 由于我们使用到多图纸功能 这时需要考虑图纸间的线路连接 在单个图纸中 我们可以通过简单的网络
  • pandas数据处理大全(必备)

    目录 文章目录 目录 pandas读取文件 pandas存储文件 pandas处理空值和缺失值 pandas创建空dataframe dataframe索引值的修改 dataframe选择行与列 dataframe转置 dataframe添
  • Nodejs 中的非阻塞I/O、异步和事件驱动

    前言 Node js使用 事件驱动机制 具有非阻塞的I O模型这样的特点 Node js中的大多数Api都用到了异步函数 那麽又该如何获取异步函数返回的数据呐 废话不多说 来看看本次分享 都有哪些亮点吧 一 Nodejs 的 非阻塞 I O