Node.js的非阻塞I/O、异步与事件驱动介绍
作者:小旭2021 发布时间:2024-05-13 09:35:02
标签:Node.js,非阻塞,I/O,异步,事件,驱动
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


猜你喜欢
- 实现目的:实现字符串切片去重,只是两个字符完全相同时,去除一个。实现方式:考虑两种,一种是常规的双重循环去除,另一种是利用map的key的唯
- 现在电子商务网站的设计,正面临着一系列的挑战,其中最主要的挑战是:我们尝试建立一种用户体验,来提高用户在线购物的可能性。为了对抗网上激烈的竞
- 有些网页制 * 好者提出了这样一个问题——怎么使用Dreamweaver制作出交换图像来。今天,我向大家介绍制作复杂交换图像的方法,相信能够对
- 1、场景import { observe } from "./reactive";import Watcher from
- 一:取字符串中第几个字符print "Hello"[0] 表示输出字符串中第一个字符print "Hello&
- 目录json支持的格式:代码操作1.json转化为python2. python序列化为json总结json转化为python表示反序列化p
- 咳咳,大家看看就好了,本人不负责所产生的后果SELECT * FROM `vbb_strikes` WHERE 1 union select
- 本文详细讲述了DRF认证组件的原理以及用法.源码剖析讲解DRF版本的时候我们都知道了,在dispatch方法里执行了initial方法来初始
- 什么是yaml一种标记语言。yaml 是专门用来写配置文件的语言,非常简洁和强大更直观,更方便,有点类似于json格式yaml文件格式:te
- 摘要:下文讲述五种运行sql脚本的方法,如下所示:实验环境:sql server 2008 R2在一次会议讨论中,大家咨询我使用SSMS运行
- 如下所示:# -*- coding:utf-8 -*-from datetime import datetimeimport redef M
- PHP session用法其实很简单它可以把用户提交的数据以全局变量形式保存在一个session中并且会生成一个唯一的session_id,
- 什么是钩子之前有转一篇关于回调函数的文章钩子函数、注册函数、回调函数,他们的概念其实是一样的。 钩子函数,顾名思义,就是把我们自己实现的ho
- 1. 连接数据库要连接到数据库首先要导入驱动程序。例如import _ "github.com/go-sql-driver/mys
- /** * 获取地址栏参数 * * @example GetUrlString('id
- 1、创建表的同时创建主键约束(1)无命名create table student ( studentid int primary key n
- javascript:单行注释用//呵呵呵呵;多行注释用/*hdhdhdh*/javascript中区别大小写,定义变量使用关键字var,语
- 一、前言1.1 关于描述性统计分析概括地来说,描述性统计分析就是在收集到的数据的基础上,运用制表和分类,图形以及计算概括性数据来描述数据特征
- 1,exists和in的理解exists:如果子查询中包括某一行,那么就为TRUE in:如果操作数为TRUE等于表达式列表中的一个,那么就
- slice 可以用来获取数组片段,它返回新数组,不会修改原数组。除了正常用法,slice 经常用来将 array-like 对象转换为 tr