Nodejs的非阻塞IO、异步以及 事件驱动EventEmitter解决异步 (7)
时间:2019-10-25
本文章向大家介绍Nodejs的非阻塞IO、异步以及 事件驱动EventEmitter解决异步 (7),主要包括Nodejs的非阻塞IO、异步以及 事件驱动EventEmitter解决异步 (7)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、 Nodejs 的单线程 非阻塞 I/O 事件驱动
Node.js 不为每个客户连接创建一个新的线程, 而仅仅使用一个线程。当有用户连接了,
就触发一个内部事件,通过非阻塞 I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。
使用 Node.js,一个 8GB 内存的服务器,可以同时处理超过 4 万用户的连接。
2 异步IO执行过程
console.log('1'); // fs.readFile 是非阻塞IO fs.readFile('mime.js',function (err,data) { console.log('2'); }); console.log('3');
执行结果
2、 异步存在的问题
// 错误写法 // 非阻塞io 引发的问题 function getMime() { console.log('1'); // 1 fs.readFile('mime.json',function(err,data){ console.log('2'); // 2 return data.toString(); }); console.log('3'); // 3 } console.log(getMime()); // undefined
执行结果,获取不到文件内容
3 回调解决异步问题
// 正确写法 var fs = require('fs'); // 回调 callback function getMime(callback) { fs.readFile('mime.json',function(err,data){ callback(data); //使用回调传值 }); } getMime(function (result) { console.log(result.toString()); // 回调过程中获取值 }); // 执行函数
4 事件驱动
1. nodejs 事件循环:
nodejs 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高;
nodejs 的每一份api都是异步的,并作为一个独立线程运行,使用一步函数调用,并处理并发;
nodejs 有多个内置的事件,我们可以通过引入 events 模块,并实例化 EventEmitter 类来绑定和监听事件.
// 引入 events 模块 var events=require('events'); //console.log(events); // 实例 EventEmitter 监听和广播 事件对象 var EventEmitter=new events.EventEmitter(); //广播 和接收广播 EventEmitter.on('to_mime',function(data){ console.log(data); }); //监听to_parent的广播 EventEmitter.on('to_parent',function(data){ //console.log('接收到了这个广播事件'); console.log(data); EventEmitter.emit('to_mime','给mime发送的数据') }); setTimeout(function(){ console.log('开始广播...'); //广播to_parent事件 EventEmitter.emit('to_parent','给to_parent发送的数据') },1000);
执行结果
5 使用事件驱动解决异步问题
var fs = require('fs'); var events = require('events'); var EventEmitter = new events.EventEmitter(); function getMime() { fs.readFile('mime.json',function(err,data){ EventEmitter.emit('mime',data) // 事件传值 }); } getMime(); //执行函数 // 监听 mime 事件 EventEmitter.on('mime',function (data) { console.log(data.toString()); });
原文地址:https://www.cnblogs.com/angle6-liu/p/11738653.html
- 快速完成(图片旋转,查看原图)
- Jsp中格式化时间戳的常用标签
- 反射+自定义注解---实现Excel数据列属性和JavaBean属性的自动映射
- 后台模板管理系统___左侧菜单数据的异步加载
- Shiro眼皮下玩ajax,玩出302 Found
- 对于JSONObject,我只是临时抱佛脚
- 总结切面编程AOP的注解式开发和XML式开发
- SpringMVC注解@RequestMapping之produces属性导致的406错误
- SpringBoot集成MyBatis的分页插件PageHelper(回头草)
- SpringBoot整合Mybatis之进门篇
- Tomcat和Java Virtual Machine的性能调优总结
- 一次浴火重生的MySQL优化(EXPLAIN命令详解)
- 简单聊聊不可或缺的Nginx反向代理服务器--实现负载均衡【上篇】
- Java设计模式之适配器设计模式(项目升级案例)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C语言定义数组时使用枚举作为数组的下标
- 机器学习(七)—回归
- C语言定义数组时使用枚举作为数组的下标 ——c99功能
- C语言——for循环和while循环的效率区别——类似哨兵思想
- 机器学习(八)—Apriori算法
- 机器学习(九)—FP-growth算法
- LeetCode — (1)
- Django初体验——搭建简易blog
- Python开发简单记事本
- 在stm32开发可以调用c标准库的排序和查找 qsort bsearch
- Python解析excel文件并存入sqlite数据库
- python学习总结
- C语言calloc()函数:分配内存空间并初始化——stm32中的应用
- 提升代码的运算速度——代码优化的方法总结
- 自己实现sizeof+大小端测试