Node.js的非阻塞I/O、异步与事件驱动介绍

作者:小旭2021 时间:2024-05-13 09:35:02 

1、Node.js的单线程 非阻塞 I/O 事件驱动

在 Java、PHP 或者.net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。
而每个线程需要耗费大约 2MB 内存。也就是说,理论上,一个 8GB 内存的服务器可以同时连接的最大用户数为 4000 个左右。要让 Web 应用程序支持更多的用户,就需要增加服务器的数量,而 Web 应用程序的硬件成本当然就上升了。
Node.js 不为每个客户连接创建一个新的线程, 而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞 I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。
使用 Node.js,一个 8GB 内存的服务器,可以同时处理超过 4 万用户的连接。

2、Node.js回调处理异步

//错误的写法:
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、Node.js 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)

Node.js 事件循环

/*
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的数据

来源:https://www.cnblogs.com/chenyablog/p/9849796.html

标签:Node.js,非阻塞,I/O,异步,事件,驱动
0
投稿

猜你喜欢

  • vant中的toast轻提示实现代码

    2024-04-26 17:38:53
  • Python中的变量赋值

    2023-07-23 06:00:10
  • javascript中直接写php代码的方法

    2024-05-02 16:27:46
  • 详解Python中的进程和线程

    2021-10-06 21:49:03
  • python生成tensorflow输入输出的图像格式的方法

    2021-03-20 05:21:08
  • 深入理解MySQL事务的4种隔离级别

    2024-01-21 09:52:40
  • javascript开发随笔一 preventDefault的必要

    2024-04-26 17:14:05
  • Python列表推导式与生成器表达式用法示例

    2023-05-31 01:30:40
  • windows下安装、卸载mysql服务的方法(mysql 5.6 zip解压版安装教程)

    2024-01-13 04:56:20
  • Python操作MySQL MongoDB Oracle三大数据库深入对比

    2024-01-13 21:48:00
  • vue组件发布到npm简单步骤

    2024-05-09 09:38:57
  • Python实现的递归神经网络简单示例

    2022-03-26 04:19:48
  • Python中json.dumps()函数的使用解析

    2022-11-04 19:41:09
  • python实现图片转字符画

    2021-02-13 22:58:33
  • python生成九宫格图片

    2022-09-09 04:46:34
  • python利用paramiko连接远程服务器执行命令的方法

    2021-07-19 01:07:34
  • python中文件操作与异常的处理图文详解

    2021-09-04 16:04:33
  • Python字符串逐字符或逐词反转方法

    2022-12-24 21:14:45
  • Python 调用VC++的动态链接库(DLL)

    2023-06-19 09:01:44
  • centos7之Python3.74安装教程

    2023-10-27 15:15:24
  • asp之家 网络编程 m.aspxhome.com