浅读-《深入浅出Nodejs》

news2025/2/3 18:49:21

这次算是重读 深入浅出Nodejs,了解到很多之前忽略的细节,收获蛮多,这次顺便将其记录分享,对学习和了解Nodejs有及其大的帮助。

1.Nodejs

    • 事件驱动、非阻塞IO,一个开源和跨平台的 JavaScript 运行时环境
    • 异步I/O:每个调用之间无须等待之前的I/O调用结束;
    • 事件:轻量级、松耦合、只关注事务点;
    • Node擅长I/O密集型的应用场景;(适合面向网络,不适合慢IO,如读磁盘)

2.模块

    • CommonJS的模块规范。Node中引入模块三步:路径分析、文件定位、编译执行;
    • 不论是核心模块还是文件模块,require()方法对相同模块的二次加载都一律采用缓存优先的方式,这是第一优先级的。不同之处在于核心模块的缓存检查先于文件模块的缓存检查;

3.异步IO

  • 单线程异步编程,极大的利用资源,避免单线程阻塞,更好的利用CPU;
  • 完美的异步I/O应该是应用程序发起非阻塞调用,无须通过遍历或者事件唤醒等方式轮询,可以直接处理下一个任务,只需在I/O完成后通过信号或回调将数据传递给应用程序即可;
  • 注意:Nodejs单线程仅仅只是JavaScript执行在单线程中。在Node中,无论是*nix还是Windows平台,内 部完成I/O任务的另有线程池;

Node异步I/O

  • 事件循环:Node便会创建一个类似于while(true)的循环,每执行一次循环体的过程我们称为Tick。每个Tick的过程就是查看是否有事件待处理,如果有,就取出事件及其相关的回调函数。如果存在关联的回调函数,就执行它们。然后进入下个循环,如果不再有事件处理,就退出进程;
  • 观察者:在每个Tick的过程中,如何判断是否有事件需要处理呢?这里必须要引入的概念是观察者。每个事件循环中有一个或者多个观察者,而判断是否有事件要处理的过程,就是向这些观察者询问是否有要处理的事件;

事件循环是一个典型的生产者/消费者模型。异步I/O、网络请求等则是事件的生产者,源源不断为Node提供不同类型的事件,这些事件被传递到对应的观察者那里,事件循环则从观察者那里取出事件并处理;

非I/O异步API

setTimeout()setInterval()setImmediate()process.nextTick()

setTimeout

  • setTimeout()setInterval()与浏览器中的API是一致的,分别用于单次和多次定时执行任务。
  • 调用setTimeout()或者setInterval()创建的定时器会被插入到定时器观察者内部的一个红黑树中。每次Tick执行时,会从该红黑树中迭代取出定时器对象,检查是否超过定时时间,如果超过,就形成一个事件,它的回调函数将立即执行。

process.nextTick

  • 每次调用process.nextTick()方法,只会将回调函数放入队列中,在下一轮Tick时取出执行;

setImmediate

  • setImmediate() 参数传入的任何函数都是在事件循环的下一个迭代中执行的回调;
  • 延迟 0 毫秒的 setTimeout() 回调与 setImmediate() 非常相似。 执行顺序取决于各种因素,但是它们都会在事件循环的下一个迭代中运行;

区别

  • 传给 process.nextTick() 的函数会在事件循环的当前迭代中(当前操作结束之后)被执行。 这意味着它会始终在 setTimeout 和 setImmediate 之前执行。
  • 同步和异步的区别。也就是说,是否是同步还是异步,关注的是任务完成时消息通知的方式。由调用方盲目主动问询的方式是同步调用,由被调用方主动通知调用方任务已完成的方式是异步调用;
  • 是否是阻塞还是非阻塞,关注的是接口调用(发出请求)后等待数据返回时的状态。被挂起无法执行其他操作的则是阻塞型的,可以被立即「抽离」去完成其他「任务」的则是非阻塞型的;

4.异步编程

  • 优点:利用事件循环的方式,JavaScript线程像一个分配任务和处理结果的大管家,I/O线程池里的各个I/O线程都是小二,负责兢兢业业地完成分配来的任务,小二与管家之间互不依赖,保持整体高效率;
  • 缺点:这个模型的缺点则在于管家无法承担过多的细节性任务,如果承担太多,则会影响到任务的调度;(CPU密集型是弱点)

异步编程解决方案

  • 事件发布/订阅模式;
  • Promise/Deferred模式;
  • 流程控制库;

异步并发控制

  • 异步调用的并发限制在不同场景下的需求不同:非实时场景下,让超出限制的并发暂时等待执行可以满足需求;(一个队列来控制并发量,如果当前活跃(指调用发起但未执行回调)的异步调用量小于限定值,从队列中取出执行。如果活跃调用达到限定值,调用暂时存放在队列中。❑ 每个异步调用结束时,从队列中取出新的异步调用执行)

5.内存控制

  • V8堆内存的最大值在64位系统上为1464 MB, 32位系统上则为732 MB;
  • 在V8中,主要将内存分为新生代和老生代两代。新生代中的对象为存活时间较短的对象,老生代中的对象为存活时间较长或常驻内存的对象;
  • Node的内存构成主要由通过V8进行分配的部分和Node自行分配的部分,受V8的垃圾回收限制的主要是V8的堆内存。(利用堆外内存可以突破内存限制的问题,如 Buffer
  • 内存泄漏原因:缓存、队列消费不及时、作用域未释放;
  • 操作大文件可以使用stream模块用于处理;

6.理解Buffer

  • Buffer主要用于操作字节;
  • 小而频繁的Buffer操作时,采用slab的机制进行预先申请和事后分配,使得JavaScript到操作系统之间不必有过多的内存申请方面的系统调用;
  • 大块的Buffer对象,直接使用C++层面提供的内存;

7.网络编程

Nodejs提供的netdgramhttptls等模块,让面向网络编程更加便捷。

通过http模块即可快速搭建Web服务器;网络是轻IO操作,再配合上Nodejs异步IO,Nodejs在面向网络编程方面能维持的并发量和QPS都是不容小觑的;

8.构建Web应用

告诉开发者如何通过Nodejs构建一个合格的网络应用服务。

  1. 使用Nodejs配合http模块搭建路由服务;
  2. 解析、使用和存储Cookie;
  3. Session使用和存储,包括如何高效管理Session;
  4. 通过网络缓存避免带宽浪费;
  5. 数据上传需要注意点:大文件使用流式解析、限制上传内容的大小、避免CSRF攻击加强校验;
  6. 中间件的理念和实现;

9.玩转进程

  1. 服务模型:同步——>复制进程——>多线程——>事件驱动;
  2. child_process模块搭建多进程;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机直播app源码部署搭建:带货潮流,商城功能!

随着互联网时代的迅猛发展,手机直播app源码平台早已成为了人们获取资讯、娱乐放松等方式的主要载体,手机直播app源码平台的日益火爆,也让商人们有了一个新兴的想法出现:直播app平台如此火爆,平台的用户也如此庞大&…

perl输出中文乱码【win10】

perl输出中文乱码 运行的时候输出的内容变成了中文乱码,原因首先来查找一下自己的perl的模块里面是否有Encode-CN。请运行打开你的cmd并输入perldoc -l Encode::CN 如果出现了地址 则就是有,如果没有需要进行该模块的安装。 安装方式有很多种&#xff0…

Three.js——十二、MeshPhysicalMaterial清漆层、粗糙度、物理材质透光率以及折射率(结尾附代码)

环境贴图作用测试 MeshPhysicalMaterial清漆层 MeshPhysicalMaterial和MeshStandarMaterial都是拥有金属度metalness、粗糙度roughness属性的PBR材质,MeshPhysicalMaterial是MeshStandarMaterial的子集,除了继承了他的这些属性以外,还新增了…

NDK OpenGL实现美颜功能

NDK​系列之OpenGL实现美颜特效,本节主要是在上一节大眼萌的特效视上增加美颜特效。 OpenGL视频特效系列: NDK OpenGL渲染画面效果 NDK OpenGL离屏渲染与工程代码整合 NDK OpenGL仿抖音极快极慢录制特效视频 NDK OpenGL与OpenCV实现大眼萌特效 NDK…

java并发编程 11:JUC之ReentrantLock使用与原理

目录 使用可重入可打断锁超时公平锁条件变量 原理非公平锁实现原理源码流程 锁重入原理可打断原理与不可打断原理公平锁原理条件变量原理await流程signal流程 使用 ReentrantLock是可冲入锁,与 synchronized 一样,都支持可重入。但是相对于 synchronize…

kafka第三课-可视化工具、生产环境问题总结以及性能优化

一、可视化工具 https://pan.baidu.com/s/1qYifoa4 密码:el4o 下载解压之后,编辑该文件,修改zookeeper地址,也就是kafka注册的zookeeper的地址,如果是zookeeper集群,以逗号分开 vi conf/application.conf 启…

如何刻录光盘

如何刻录光盘 1 、将光盘放入光驱,选择“用于CD/DVD播放机” ,该模式下,刻录在光盘的文件无法进行编辑和删除 2 、将需要刻录的文件拷贝至光盘内,则会在“准备好写入光盘中的文件”下显示拷贝进去的文件,此时文件还没…

EDI 工作流操作指南

一个完整的EDI工作流中,起始端为通常为文件传输端口:如AS2、OFTP等,末端为数据库端口。此前的文章中我们对AS2端口以及数据库端口已做了详细介绍,本文主要介绍 EDI 文件的格式转换以及映射。 如下图所示,工作流界面中…

安装blissOS重启后无法进入图形化界面

重启blissOS 重启时,按e键两下 进入 上图是一个可编辑页面,不要删除修改前面的内容,移动光标前往quiet,然后删除quiet输入“ nomodeset xforceseva ”,然后按下回车 然后按回车,按b键进入系统 在set-…

class组件constructor方法

class组件constructor方法 https://blog.csdn.net/m0_37557930/article/details/116228217 https://blog.csdn.net/qq_39207948/article/details/113143131 ​ 为何我们使用子类继承父类,就必须在 constructor( ) 方法中调用 super( ) 方法,否则新建实…

【C】文件操作详解

这里写目录标题 文件操作什么是文件文件名文件类型文本文件二进制文件 文件缓冲区文件指针文件的打开和关闭fopenfclose 文件的顺序读写fgetcfputcfgetsfputcfscanffprintffwritefread比较scanf/fscanf/sscanfsscanf 比较printf/fprintf/sprintfsprintf 文件的随机读写fseekfte…

周考一之重做

输入一个学生的成绩,如果学习成绩>90分的同学用A表示,60-89分之间用B表示,60分以下的用C表示(10) public static void main(String[] args){ Scanner scanner new Scanner(System.in); System.out.println(“请输入学生成绩:…

linux图形界面总结---X、Xorg、WM、QT、GTK、KDE、GNOME的区别与联系

文章目录 一、 linux图形界面二、X协议三、Xfree86 Xorg四、WM(window manager:窗口管理器)五、X协议的Client端实现六、KDE、GNOME、QT和GTK直接关系七、参考: 一、 linux图形界面 linux本身没有图形界面,linux现在的图形界面的实现只是linux下的应用程…

值类型与引用类型

常见的值类型:int,long, short, float, double, byte, char, enum, struct...... 常见的引用类型:字符串, 数组, 类...... 区别&…

附录10-3.JS正则常见案例

目录 1 某一个字符串重复出现两次 2 多行字符串转变为数组套对象 3 多个正则表达式匹配一个字符 4 在指定的字符前加一些什么东西 1 某一个字符串重复出现两次 match的方式如果你使用小括号分组,第一个结果是符合正则的结果,也就是我查出来了 l…

Excel表格怎么样转换成PDF?分享这3个方法免费转换!

在日常办公和学习中,我们常常需要将Excel表格转换为PDF格式以便分享、打印或存档。本文将介绍三种简便的免费方法。方法一介绍了记灵在线工具,方法二使用办公软件(WPS或Office),方法三则使用Adobe软件。 方法一&#…

大二毕设.2-自研Spring框架

目录 项目描述: 基本演示 提取标记类 IOC容器的装载 IOC容器的操作 DI依赖注入 Aspect排序 AOP MVC 功能实现讲解 项目描述: 为了更好地学习 Spring 的核心,参考 Spring 源码实现的一个简易框架当前已实现 IOC,DI依赖注…

交叉编译gRPC初实践

快速开始 一、创建android编译目录,在grpc源码根目录下运行: mkdir -p cmake/build_android && cd cmake/build_android 二、cmkae生成对应Makefile等编译所需的文件 cmake -DCMAKE_TOOLCHAIN_FILE/zhuyazhou/DDS/tools_dds/android-ndk-r25/b…

Python(Conda)环境迁移(从win10到macos12.5)笔记

文章目录 背景环境 1、通过conda迁移2、通过python迁移3、最后(逐一安装) 背景环境 win10是以前安装的conda和py。目前需要导出的环境的版本为py3.10.4。macos是重新安装的conda,目前有的环境是py3.11.4。我是先进conda用刚安装好的base创建…

idea 有时提示找不到类或者符号,日志报java: 找不到符号的解决

解决一&#xff1a; idea maven编译成功&#xff0c;运行失败提示找不到符号&#xff0c;主要是get和set方法找不到符号&#xff0c;此时就是idea的lombok版本冲突 IDEA版本导致的Lombok失效&#xff0c;需要更新lombok版本到1.18.14及之后版本得到解决 <dependency>&…