当前位置: 首页 > news >正文

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 为 SIGINTSIGTERM 建立信号处理程序,Node.js 进程不会因收到这些信号而立即终止。相反,Node.js 将执行一系列清理操作,然后重新发出已处理的信号。

其实相对来说,用得比较少。

相关文章:

nodejs篇 process模块

目录 前言 监听回调 beforeExit 、exit、uncaughtException beforeExit exit uncaughtException Process常用属性 stdout stdin process方法 process.cwd()&#xff0c;process.chdir() process.nextTick() process.exit() process.kill() 前言 process是nodejs提…...

JavaScript高级程序设计读书分享之3章——3.4数据类型

JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 ECMAScript 有 6 种简单数据类型&#xff08;也称为原始类型&#xff09;&#xff1a;Undefined、Null、Boolean、Number、String 和 Symbol&#xff08;es6新增&#xff09;。 还有一种复杂数据类型叫…...

棱形打印--进阶2(Java)

棱形打印 问题 * *** ***** ******* ********* ******* ***** *** * * * …...

清除 git 所有历史提交记录,使其为新库

清除 git 所有历史提交记录&#xff0c;使其为新库需求方案需求 基于以前的仓库重新开发&#xff0c;这样可保留以前的配置等文件&#xff0c;但是需要删除全部的历史记录、tag、分支等。 方案 创建新的分支 使用 --orphan 选项&#xff0c;可创建1个干净的分支&#xff08;无…...

pyTorch下载和cuda下载以及学习笔记

pytorch官方网站&#xff0c;cuda官方网站 CUDA下载&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive CUDNN下载&#xff1a;https://developer.nvidia.com/rdp/cudnn-download pytorch下载&#xff1a;pytorch.org 任务管理器中只显示CUDA占用的专用内存&#…...

【学习总结】IMU预积分推导

本文仅用于记录自己学习总结。记录IMU预积分推导过程&#xff0c;不包含具体原理。 符号表示 RRR: 表示旋转矩阵 vvv: 表示速度 ppp: 表示位移 ExpExpExp: 指数映射&#xff0c;将旋转向量映射为旋转矩阵 w~\widetilde{w}w: 角速度观测值 f~\widetilde{f}f​: 加速度观测值 bg…...

天猫商城自动化python脚本(仅供初学者学习使用)

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…...

代码随想录第十一天(459)

文章目录459. 重复的子字符串答案思路暴力破解移动匹配459. 重复的子字符串 也不知道为啥这个提示简单题…… 答案思路 暴力破解 例如&#xff1a;abcabc 移位一次&#xff1a;cabcab 移位两次&#xff1a;bcabca 移位三次&#xff1a;abcabc 现在字符串和原字符串匹配了…...

线程及线程池学习

1 线程和进程的区别&#xff1f;进程&#xff1a;进程指正在运行的程序。线程&#xff1a;线程是进程中的一个执行单元&#xff0c;负责当前进程中程序的执行&#xff0c;一个进程中至少有一个线程。同一个进程中的多个线程之间可以并发的执行。2 创建线程有哪几种方式&#xf…...

SpringBoot整合(四)整合Ehcache、Redis、Memcached、jetcache、j2cache缓存

​ 企业级应用主要作用是信息处理&#xff0c;当需要读取数据时&#xff0c;由于受限于数据库的访问效率&#xff0c;导致整体系统性能偏低。 ​ 为了改善上述现象&#xff0c;开发者通常会在应用程序与数据库之间建立一种临时的数据存储机制&#xff0c;该区域中的数据在内存…...

想要的古风女生头像让你快速get

如今我看到很多人都喜欢用古风女生当作头像&#xff0c;那么今天我就来教大家如何快速得到一张超美的古风女生头像~ 上图就是我使用 APISpace 的 AI作画(图像生成)服务 快速生成的古风女生头像&#xff0c;不仅可以限定颜色&#xff0c;还可以选择『宝石镶嵌』或『花卉造型』这…...

传统企业数字化转型,到底难在哪里?

数字化转型过程中面临最大的挑战和问题是什么&#xff1f;这篇整理了企业在数字化转型过程中普遍面临的9大问题和挑战以及如何解决这些问题&#xff0c;希望能够对各位企业数字化转型有多启发和帮助。 01 企业数字化转型三大现状 在梳理企业数字化转型问题之前&#xff0c;我想…...

Python:青蛙跳杯子(BFS)

题目描述 X 星球的流行宠物是青蛙&#xff0c;一般有两种颜色&#xff1a;白色和黑色。 X 星球的居民喜欢把它们放在一排茶杯里&#xff0c;这样可以观察它们跳来跳去。 如下图&#xff0c;有一排杯子&#xff0c;左边的一个是空着的&#xff0c;右边的杯子&#xff0c;每个…...

6.10 谱分解

文章目录计算方法代码实现计算方法 单纯矩阵normal matrix指的是符号ATAAATA^TAAA^TATAAAT的矩阵&#xff0c;他们的特征值互异。此外&#xff0c;单纯矩阵还有个特点&#xff0c;他们的特征空间彼此正交。   对于单纯矩阵&#xff0c;存在以下的谱定理Spectral theorem&…...

MySQL入门篇-MySQL 行转列小结

备注:测试数据库版本为MySQL 8.0 需求:求emp表各个岗位的工资之和&#xff0c;如无&#xff0c;用0代替 如需要scott用户下建表及录入数据语句&#xff0c;可参考:scott建表及录入数据sql脚本 CASE语法 SELECT deptno,ifnull(sum(case when job MANAGER then sal else 0 …...

项目管理常见的十大难题及其症状

01缺少维护文档时常&#xff0c;项目工作紧张时&#xff0c;第一个去掉的就是文档工作。有时即使项目有时间&#xff0c;也不会创建文档&#xff1b;或是创建了文档&#xff0c;却很少在项目进行过程中维护它。症状产品与需求文档不符;技术文档过时&#xff0c;无法保证技术的延…...

技术方案模板

0.基本原则 1.可量化,很大、很多、很高 到底是多少?基本没影响,到底有没有影响什么情况下有影响? 2.可实施,结合实际情况最终可落地 3.可指导,非方案制定人能理解,能在尽量少的人工沟通的情况下实现方案 4.可复用,设计的方案,再次出现类似需求时可以做到少开发或不…...

MySQL中对于单表和多表的操作

一、单表查询素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等显示所有职工的基本信息。mysql8.0 [chap03]>select * from worker;查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。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&#xff1a;在引入组件之后与组件中的对象和方法进行合并&#xff0c;相当于扩展了父组件的对象与方法&#xff0c;可以理解为形成了一个新的组件。混入 (mixins)&#xff1a;是一种分发 Vue 组件中可复用功能的非常灵活的方式…...

【PyQt】PyQt学习(一)框架介绍+环境搭建

简介 写在最前面的话 在决定学习、使用一个框架之前需要考量如下几点&#xff1a; 框架运行效果&#xff1b;框架应用范围&#xff1b;框架学习成本和迁移成本&#xff1b;实现自己所需功能的开发效率&#xff1b; 只有综合考量如上四个方面&#xff0c;才能更好地选择适合…...

浅谈前端设计模式:策略模式和状态模式的异同点

一、策略模式 策略模式是定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 而且策略模式是重构小能力&#xff0c;特别适合拆分“胖逻辑”。 这个定义乍一看会有点懵&#xff0c;不过通过下面的例子就能慢慢理解它的意思。 先来看一个真实场景 某次活动要做…...

线性杂双功能PEG试剂OPSS-PEG-Acid,OPSS-PEG-COOH,巯基吡啶聚乙二醇羧基

英文名称&#xff1a;OPSS-PEG-COOH&#xff0c;OPSS-PEG-Acid 中文名称&#xff1a;巯基吡啶-聚乙二醇-羧基 OPSS-PEG-COOH是一种具有OPSS和羧基的线性杂双功能PEG试剂。它是一种有用的带有PEG间隔基的交联剂。OPSS代表正吡啶基二硫化物或邻吡啶基二硫代&#xff0c;与硫醇、…...

开发微服务电商项目演示(四)

一&#xff0c;网关服务限流熔断降级第1步&#xff1a;启动sentinel-dashboard控制台和Nacos注册中心服务第2步&#xff1a;在网关服务中引入sentinel依赖<!-- sentinel --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>sprin…...

【C语言学习笔记】:静态库

一、什么是库 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作…...

社科院与杜兰大学中外合作办学金融管理硕士——30+的年龄在职读研有必要吗?

说起读研&#xff0c;年龄在什么区间最合适呢&#xff1f;上次有位咨询的同学反馈年龄已经快35岁了&#xff0c;有一份不错的工作&#xff0c;但又不甘心止步于此&#xff0c;想要通过提升学历升职加薪&#xff0c;但又纠结自己是否能静下心来学习、是否能顺利毕业、拿到的证书…...

2.13作业【设备树解析,按自己理解】

设备树定义 设备树&#xff08;device tree是描述硬件信息的一种树形结构&#xff0c;设备书文件在linux内核启动后被内核解析。描述一个硬件设备信息的节点我们叫做设备节点&#xff0c;一个设备节点内部包含当前硬件的多个不同属性&#xff0c;相同节点不同属性是以链式结构存…...

《NFL星计划》:巴尔的摩乌鸦·橄榄1号位

巴尔的摩乌鸦&#xff08;英语&#xff1a;Baltimore Ravens&#xff09;是一支职业美式橄榄球球队位于马里兰州的巴尔的摩。他们现时为美国美式橄榄球联合会的北区进行比赛&#xff0c;其主场为M&T银行体育场。乌鸦队曾在2000年和2012年取得超级碗冠军。 巴尔的摩乌鸦 成…...

Allegro如何设置自动保存和自动保存的时间操作指导

Allegro如何设置自动保存和自动保存的时间操作指导 做PCB设计的时候,自动保存软件是一个必要的功能,Allegro同样支持设置自动保存,而且可以设置自动保存的时间。 如下图 具体操作如下 点击Setup点击User Preferences...

Kotlin实现简单音乐播放器

关于音乐播放器&#xff0c;我真的是接触比较多&#xff0c;听歌作为我第一大爱好&#xff0c;之前也用Java设计过音乐播放器&#xff0c;感兴趣的同学可以阅读&#xff1a;Android Studio如何实现音乐播放器&#xff08;简单易上手&#xff09;和 Android Studio实现音乐播放器…...