nodejs篇 process模块
目录
前言
监听回调 beforeExit 、exit、uncaughtException
beforeExit
exit
uncaughtException
Process常用属性
stdout
stdin
process方法
process.cwd(),process.chdir()
process.nextTick()
process.exit()
process.kill()
前言
process是nodejs提供的进程管理工具,nodejs其中一大特点,单进程,单线程。
既然如此,如何处理异步函数?node.js提供的API中有大量的回调函数,用于解决异步逻辑。所有的异步回调函数都继承了 events模块中EventEmitter这个类,而这个类实现的方式,都遵循着一项运行机制 eventLoop(事件循环)。
eventLoop实现的底层逻辑,有一部分就依赖于对进程的控制。
process模块可以直接从global获取,因为它们完全相等
const process = require("node:process");
console.log(process === global.process) // true
nodejs其它相关内容学习
1. nodejs commonjs介绍
2. nodejs fs模块介绍
3. nodejs path模块介绍
4.nodejs events模块介绍
5.nodejs http模块介绍
6.nodejs net模块介绍
7.nodejs url模块介绍
监听回调 beforeExit 、exit、uncaughtException
const process = require("node:process");// 当evnetLoop清空(既无宏任务也无微任务),在主进程关闭之前调用
process.on("beforeExit", (code) => {console.log("Process beforeExit event with code: ", code);
// setTimeout(() => {
// console.log(456);
// }, 10);function a() {console.log('a')}a()
});// 主进程彻底退出时调用,也可以理解为程序彻底结束时调用
process.on("exit", (code) => {console.log("Process exit event with code: ", code);
});
beforeExit
调用的时机:每一次evnetLoop清空(既无宏任务也无微任务),在主进程关闭之前调用。
正常情况下,如果没有任何待处理的任务,Node进程会自动退出,设置beforeExit事件的监听函数以后,就可以提供一个机会,再部署一些任务,使得Node进程不退出。
注意点:
1. 如果是显式终止程序(比如调用process.exit()),或者因为发生未捕获的错误,而导致进程退出,这些场合不会触发beforeExit事件。(因为以上两种情况都不是evnetLoop被清空)
2. 当异步代码在回调中时,会再一次触发beforeExit ,可能会死循环,注意控制好异步代码的出口。
错误
const process = require("node:process");process.on("beforeExit", (code) => {console.log("Process beforeExit event with code: ", code);setTimeout(() => {console.log(456);}, 10);
});
setTimeout会再一次为eventLoop添加一个宏任务,当eventLoop执行完宏任务,清空时,会再一次触发beforeExit,进入无限循环。。。
正确
const process = require("node:process");var key = false;// enventLoop已经清空之后调用,如果有新的异步开启,将再一次触发,进入死循环setTimeout,setImmediate等
process.on("beforeExit", (code) => {console.log("Process beforeExit event with code: ", code);if (key) {return;} else {setTimeout(() => {key = true;}, 10);}
});
exit
调用的时机:监听到进程即将关闭,在此之前执行的回调。
但回调同步执行完成之后,一定会将主进程关闭,停止程序的运行。
注意:1.与beforeExit不同,不能在回调中执行异步代码,因为回调同步执行完成后,就会立刻将主进程关闭,程序也会结束。
2. 显式终止程序(比如调用process.exit()),或者因为发生未捕获的错误,而导致进程退出,这些都会触发exit,算是弥补了beforeExit的不足。
uncaughtException
const process = require("node:process");// 监听进程执行过程中的所有报错
process.on("uncaughtException", (err) => {console.error("An unhandled exception is raised. Look at stack for more details");console.error(err.stack);process.exit(1);
});console.log(abc)
An unhandled exception is raised. Look at stack for more details
ReferenceError: abc is not definedat Object.<anonymous> (D:\Codes\Test\process.js:31:13)at Module._compile (internal/modules/cjs/loader.js:1085:14)at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)at Module.load (internal/modules/cjs/loader.js:950:32)at Function.Module._load (internal/modules/cjs/loader.js:790:12)at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)at internal/main/run_main_module.js:17:47
调用时机:监听Node的一个全局性事件uncaughtException,只要有错误没有捕获,就会触发这个事件。
Process常用属性
process.argv:返回一个数组,成员是当前进程的所有命令行参数。process.env:返回一个对象,成员为当前Shell的环境变量,比如process.env.HOME。process.installPrefix:返回一个字符串,表示 Node 安装路径的前缀,比如/usr/local。相应地,Node 的执行文件目录为/usr/local/bin/node。process.pid:返回一个数字,表示当前进程的进程号。process.platform:返回一个字符串,表示当前的操作系统,比如Linux。process.title:返回一个字符串,默认值为node,可以自定义该值。process.version:返回一个字符串,表示当前使用的 Node 版本,比如v7.10.0。
stdout
相当于console.log()
process.stdout.write(123 + '\n')
// 等价于
console.log(123 + '\n')
将文件读取出来,压缩并打印
var fs = require('fs');
var zlib = require('zlib');fs.createReadStream('url.js').pipe(zlib.createGzip()).pipe(process.stdout);
stdin
process.stdin返回一个对象,表示标准输入。感觉用处不大
process.stdin.pipe(process.stdout)
process方法
process.chdir():切换工作目录到指定目录。process.cwd():返回运行当前脚本的工作目录的路径。process.exit():退出当前进程。process.getgid():返回当前进程的组ID(数值)。process.getuid():返回当前进程的用户ID(数值)。process.nextTick():指定回调函数在当前执行栈的尾部、下一次Event Loop之前执行。process.on():监听事件。process.setgid():指定当前进程的组,可以使用数字ID,也可以使用字符串ID。process.setuid():指定当前进程的用户,可以使用数字ID,也可以使用字符串ID。
process.cwd(),process.chdir()
cwd方法返回进程的当前目录(绝对路径),chdir方法用来切换目录。
console.log(process.cwd(), process.chdir("../"));
console.log(process.cwd());/**
D:\Codes\Test undefined
D:\Codes
*/
注意,process.cwd()与__dirname的区别。前者进程发起时的位置,后者是脚本的位置,两者可能是不一致的。比如,node ./code/program.js,对于process.cwd()来说,返回的是当前目录(.);对于__dirname来说,返回是脚本所在目录,即./code/program.js。
process.nextTick()
将任务放到当前一轮事件循环(Event Loop)的尾部,当eventLoop下一个轮询到来前执行。其实这种设计模式很常见,vue中也有this.$nextTick,而在react中,其实也有类似的存在 import { nextTick } from 'react';
process.nextTick(function () {console.log('下一次Event Loop即将开始!');
});setTimeout(function () {console.log("已经到了下一轮Event Loop!");
}, 0);/**
下一次Event Loop即将开始!
已经到了下一轮Event Loop!
*/
setTimeout(f,0)是将任务放到下一轮事件循环的头部,因此nextTick会比它先执行。另外,nextTick的效率更高,因为不用检查是否到了指定时间。
process.exit()
process.exit方法用来退出当前进程。它可以接受一个数值参数,如果参数大于0,表示程序出错,强制退出;如果等于0表示程序结束,正常退出,exit默认的参数是0。
try {// ....process.exit();
} catch (error) {if (error) {process.exit(1);}
}
这个函数会触发 exit监听回调f的执行 process.on("exit",f)
process.kill()
process.kill方法用来对指定ID的线程发送信号,默认为SIGINT信号,并且会结束对应的Id的线程。
process.kill(process.pid, 'SIGTERM');
process.exit([code]) 对于快速结束进程很有用。但在其他情况下,您可能希望在关闭之前向该进程传递一个信号以进行清理/正常关闭
Node.js 为 SIGINT 和 SIGTERM 建立信号处理程序,Node.js 进程不会因收到这些信号而立即终止。相反,Node.js 将执行一系列清理操作,然后重新发出已处理的信号。
其实相对来说,用得比较少。
相关文章:
nodejs篇 process模块
目录 前言 监听回调 beforeExit 、exit、uncaughtException beforeExit exit uncaughtException Process常用属性 stdout stdin process方法 process.cwd(),process.chdir() process.nextTick() process.exit() process.kill() 前言 process是nodejs提…...
JavaScript高级程序设计读书分享之3章——3.4数据类型
JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 ECMAScript 有 6 种简单数据类型(也称为原始类型):Undefined、Null、Boolean、Number、String 和 Symbol(es6新增)。 还有一种复杂数据类型叫…...
棱形打印--进阶2(Java)
棱形打印 问题 * *** ***** ******* ********* ******* ***** *** * * * …...
清除 git 所有历史提交记录,使其为新库
清除 git 所有历史提交记录,使其为新库需求方案需求 基于以前的仓库重新开发,这样可保留以前的配置等文件,但是需要删除全部的历史记录、tag、分支等。 方案 创建新的分支 使用 --orphan 选项,可创建1个干净的分支(无…...
pyTorch下载和cuda下载以及学习笔记
pytorch官方网站,cuda官方网站 CUDA下载:https://developer.nvidia.com/cuda-toolkit-archive CUDNN下载:https://developer.nvidia.com/rdp/cudnn-download pytorch下载:pytorch.org 任务管理器中只显示CUDA占用的专用内存&#…...
【学习总结】IMU预积分推导
本文仅用于记录自己学习总结。记录IMU预积分推导过程,不包含具体原理。 符号表示 RRR: 表示旋转矩阵 vvv: 表示速度 ppp: 表示位移 ExpExpExp: 指数映射,将旋转向量映射为旋转矩阵 w~\widetilde{w}w: 角速度观测值 f~\widetilde{f}f: 加速度观测值 bg…...
天猫商城自动化python脚本(仅供初学者学习使用)
作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的…...
代码随想录第十一天(459)
文章目录459. 重复的子字符串答案思路暴力破解移动匹配459. 重复的子字符串 也不知道为啥这个提示简单题…… 答案思路 暴力破解 例如:abcabc 移位一次:cabcab 移位两次:bcabca 移位三次:abcabc 现在字符串和原字符串匹配了…...
线程及线程池学习
1 线程和进程的区别?进程:进程指正在运行的程序。线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。同一个进程中的多个线程之间可以并发的执行。2 创建线程有哪几种方式…...
SpringBoot整合(四)整合Ehcache、Redis、Memcached、jetcache、j2cache缓存
企业级应用主要作用是信息处理,当需要读取数据时,由于受限于数据库的访问效率,导致整体系统性能偏低。 为了改善上述现象,开发者通常会在应用程序与数据库之间建立一种临时的数据存储机制,该区域中的数据在内存…...
想要的古风女生头像让你快速get
如今我看到很多人都喜欢用古风女生当作头像,那么今天我就来教大家如何快速得到一张超美的古风女生头像~ 上图就是我使用 APISpace 的 AI作画(图像生成)服务 快速生成的古风女生头像,不仅可以限定颜色,还可以选择『宝石镶嵌』或『花卉造型』这…...
传统企业数字化转型,到底难在哪里?
数字化转型过程中面临最大的挑战和问题是什么?这篇整理了企业在数字化转型过程中普遍面临的9大问题和挑战以及如何解决这些问题,希望能够对各位企业数字化转型有多启发和帮助。 01 企业数字化转型三大现状 在梳理企业数字化转型问题之前,我想…...
Python:青蛙跳杯子(BFS)
题目描述 X 星球的流行宠物是青蛙,一般有两种颜色:白色和黑色。 X 星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去。 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个…...
6.10 谱分解
文章目录计算方法代码实现计算方法 单纯矩阵normal matrix指的是符号ATAAATA^TAAA^TATAAAT的矩阵,他们的特征值互异。此外,单纯矩阵还有个特点,他们的特征空间彼此正交。 对于单纯矩阵,存在以下的谱定理Spectral theorem&…...
MySQL入门篇-MySQL 行转列小结
备注:测试数据库版本为MySQL 8.0 需求:求emp表各个岗位的工资之和,如无,用0代替 如需要scott用户下建表及录入数据语句,可参考:scott建表及录入数据sql脚本 CASE语法 SELECT deptno,ifnull(sum(case when job MANAGER then sal else 0 …...
项目管理常见的十大难题及其症状
01缺少维护文档时常,项目工作紧张时,第一个去掉的就是文档工作。有时即使项目有时间,也不会创建文档;或是创建了文档,却很少在项目进行过程中维护它。症状产品与需求文档不符;技术文档过时,无法保证技术的延…...
技术方案模板
0.基本原则 1.可量化,很大、很多、很高 到底是多少?基本没影响,到底有没有影响什么情况下有影响? 2.可实施,结合实际情况最终可落地 3.可指导,非方案制定人能理解,能在尽量少的人工沟通的情况下实现方案 4.可复用,设计的方案,再次出现类似需求时可以做到少开发或不…...
MySQL中对于单表和多表的操作
一、单表查询素材: 表名:worker-- 表中字段均为中文,比如 部门号 工资 职工号 参加工作 等显示所有职工的基本信息。mysql8.0 [chap03]>select * from worker;查询所有职工所属部门的部门号,不显示重复的部门号。mysql8.0 [cha…...
MFI认证
一、什么是MFI认证? 苹果MFI认证,是苹果公司(Apple Inc.)对其授权配件厂商生产的外置配件的一种使用许可,MFi认证是apple公司Made for iPhone/iPad/iPod的英文缩写。是指分别为连接iPhone/iPad/iPod而特别设计的电子配件。 [图片] 二、iOS外设连接的几种方式 [图片] 这…...
Vue中mixins的使用
文章目录mixins介绍mixins特点mixins介绍 Mixins:在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件。混入 (mixins):是一种分发 Vue 组件中可复用功能的非常灵活的方式…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
