Node.js学习笔记(六) --- Nodejs 的非阻塞 I/O、 异步、 事件驱动
1、 Nodejs 的单线程 非阻塞 I/O 事件驱动
在 Java、 PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。
而每个线程需要耗费大约 2MB 内存。也就是说,理论上,一个 8GB 内存的服务器可以同时
连接的最大用户数为 4000 个左右。要让 Web 应用程序支持更多的用户,就需要增加服务器
的数量,而 Web 应用程序的硬件成本当然就上升了。
Node.js 不为每个客户连接创建一个新的线程, 而仅仅使用一个线程。当有用户连接了,
就触发一个内部事件,通过非阻塞 I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。
使用 Node.js,一个 8GB 内存的服务器,可以同时处理超过 4 万用户的连接。
2、 Nodejs 回调处理异步
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /错误的写法: 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类来绑定和监听事件。
1 2 3 4 5 6 7 8 9 10 11 12 13 | // 引入 events 模块 var events = require( 'events' ); var EventEmitter= new events.EventEmitter(); /*实例化事件对象*/ EventEmitter.on ( 'toparent' , function (){ console.log( '接收到了广播事件' ); }) setTimeout ( function (){ console.log( '广播' ); EventEmitter.emit ( 'toparent' ); /*发送广播*/ },1000) |
Node.js 事件循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | /* Node.js 事件循环: Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。 Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件, */ // 引入 events 模块 var events = require( 'events' ); var EventEmitter = new events.EventEmitter(); //监听to_mime的广播 EventEmitter.on( 'to_mime' , function (data) { console.log(data, '接收to_mime的数据' ); }) //监听to_parent的广播 EventEmitter.on( 'to_parent' , function (data) { console.log(data, '接收to_parent的数据' ); //广播to_mime事件 EventEmitter.emit( 'to_mime' , '发送to_mime的数据' ) }) setTimeout( function () { console.log( '开始广播...' ); //广播to_parent事件 EventEmitter.emit( 'to_parent' , '发送to_parent的数据' ) }, 1000); |
执行结果
开始广播...
发送to_parent的数据 接收to_parent的数据
发送to_mime的数据 接收to_mime的数据
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?