Node.js笔记之process模块解读


Posted in Javascript onMay 31, 2018

process存在于全局对象上,不需要使用require()加载即可使用,process模块主要做两方面的事情

  1. 读:获取进程信息(资源使用、运行环境、运行状态)
  2. 写:执行进程操作(监听事件、调度任务、发出警告)资源使用

资源使用

指运行此进程所消耗的机器资源。例如内存、cpu

内存

process.memoryUsage())

{ rss: 21848064,
 heapTotal: 7159808,
 heapUsed: 4431688,
 external: 8224 
 }

rss(常驻内存)的组成见下图

Node.js笔记之process模块解读

code segment对应当前运行的代码

external对应的是C++对象(与V8管理的JS对象绑定)的占用的内存,比如Buffer的使用

Buffer.allocUnsafe(1024 * 1024 * 1000);
console.log(process.memoryUsage());

{ rss: 22052864,
 heapTotal: 6635520,
 heapUsed: 4161376,
 external: 1048584224 }

cpu

const startUsage = process.cpuUsage();
console.log(startUsage);

const now = Date.now();
while (Date.now() - now < 500);

console.log(process.cpuUsage());
console.log(process.cpuUsage(startUsage)); //相对时间

// { user: 59459, system: 18966 }
// { user: 558135, system: 22312 }
// { user: 498432, system: 3333 }

user对应用户时间,system代表系统时间

运行环境

运行环境指此进程运行的宿主环境包括运行目录、node环境、CPU架构、用户环境、系统平台

运行目录

const startUsage = process.cpuUsage();
console.log(startUsage);

const now = Date.now();
while (Date.now() - now < 500);

console.log(process.cpuUsage());
console.log(process.cpuUsage(startUsage)); //相对时间

// { user: 59459, system: 18966 }
// { user: 558135, system: 22312 }
// { user: 498432, system: 3333 }

node环境

console.log(process.version)

// v9.1.0

如果不仅仅希望获得node的版本信息,还希望v8、zlib、libuv版本等信息的话就需要使用process.versions了

console.log(process.versions);
{ http_parser: '2.7.0',
 node: '9.1.0',
 v8: '6.2.414.32-node.8',
 uv: '1.15.0',
 zlib: '1.2.11',
 ares: '1.13.0',
 modules: '59',
 nghttp2: '1.25.0',
 openssl: '1.0.2m',
 icu: '59.1',
 unicode: '9.0',
 cldr: '31.0.1',
 tz: '2017b' }

cpu架构

console.log(`This processor architecture is ${process.arch}`);

// This processor architecture is x64

支持的值包括:'arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32' 'x64'

用户环境

console.log(process.env.NODE_ENV); // dev

NODE_ENV=dev node b.js

除了启动时的自定义信息之外,process.env还可以获得其他的用户环境信息(比如PATH、SHELL、HOME等),感兴趣的可以自己打印一下试试

系统平台

console.log(`This platform is ${process.platform}`);

This platform is darwin

支持的系统平台包括:'aix' 'darwin' 'freebsd' 'linux' 'openbsd' 'sunos' 'win32'

android目前还处于试验阶段

运行状态

运行状态指当前进程的运行相关的信息包括启动参数、执行目录、主文件、PID信息、运行时间

启动参数

获取启动参数有三个方法,execArgv获取Node.js的命令行选项(见官网文档)

argv获取非命令行选项的信息,argv0则获取argv[0]的值(略有差异)

console.log(process.argv)
console.log(process.argv0)
console.log(process.execArgv)

node --harmony b.js foo=bar --version

// 输出结果
[ '/Users/xiji/.nvm/versions/node/v9.1.0/bin/node',
 '/Users/xiji/workspace/learn/node-basic/process/b.js',
 'foo=bar',
 '--version' ]
node
[ '--harmony' ]

执行目录

console.log(process.execPath);

// /Users/xxxx/.nvm/versions/node/v9.1.0/bin/node

运行时间

var date = new Date();
while(new Date() - date < 500) {}
console.log(process.uptime()); // 0.569

主文件

除了require.main之外也可以通过process.mainModule来判断一个模块是否是主文件

//a.js
console.log(`module A: ${process.mainModule === module}`);

//b.js
require('./a');
console.log(`module B: ${process.mainModule === module}`);

node b.js
// 输出
module A: false
module B: true

PID信息

console.log(`This process is pid ${process.pid}`); //This process is pid 12554

监听事件

常用的事件有beforeExit、exit、uncaughtException、message

beforeExit与exit的区别有两方面:

  1. beforeExit里面可以执行异步代码、exit只能是同步代
  2. 码手动调用process.exit()或者触发uncaptException导致进程退出不会触发beforeExit事件、exit事件会触发。

因此下面的代码console都不会被执行

process.on('beforeExit', function(code) {
 console.log('before exit: '+ code);
});
process.on('exit', function(code) {
 setTimeout(function() {
  console.log('exit: ' + code);
 }, 0);
});
a.b();

当异常一直没有被捕获处理的话,最后就会触发'uncaughtException'事件。默认情况下,Node.js会打印堆栈信息到stderr然后退出进程。不要试图阻止uncaughtException退出进程,因此此时程序的状态可能已经不稳定了,建议的方式是及时捕获处理代码中的错误,uncaughtException里面只做一些清理工作(可以执行异步代码)。

注意:node的9.3版本增加了process.setUncaughtExceptionCaptureCallback方法

当process.setUncaughtExceptionCaptureCallback(fn)指定了监听函数的时候,uncaughtException事件将会不再被触发。

process.on('uncaughtException', function() {
 console.log('uncaught listener');
});

process.setUncaughtExceptionCaptureCallback(function() {
 console.log('uncaught fn');
});

a.b();
// uncaught fn

message适用于父子进程之间发送消息,关于如何创建父子进程会放在child_process模块中进行。

调度任务

process.nextTick(fn)

通过process.nextTick调度的任务是异步任务,EventLoop是分阶段的,每个阶段执行特定的任务,而nextTick的任务在阶段切换的时候就会执行,因此nextTick会比setTimeout(fn, 0)更快的执行,关于EventLoop见下图,后面会做进一步详细的讲解

Node.js笔记之process模块解读

发出警告

process.emitWarning('Something warning happened!', {
 code: 'MY_WARNING',
 type: 'XXXX'
});

// (node:14771) [MY_WARNING] XXXX: Something warning happened!

当type为DeprecationWarning时,可以通过命令行选项施加影响

  1. --throw-deprecation 会抛出异常
  2. --no-deprecation 不输出DeprecationWarning
  3. --trace-deprecation 打印详细堆栈信息
process.emitWarning('Something warning happened!', {
 type: 'DeprecationWarning'
});
console.log(4);

node --throw-deprecation index.js
node --no-deprecation index.js
node --trace-deprecation index.js

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 源代码显示控件 (Ajax加载方式).
May 18 Javascript
javascript 命名规则 变量命名规则
Feb 25 Javascript
jquery根据name属性查找的小例子
Nov 21 Javascript
node.js中的fs.utimesSync方法使用说明
Dec 15 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
Dec 18 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
Jan 25 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
Mar 11 Javascript
完美实现八种js焦点轮播图(上篇)
Jul 18 Javascript
AngularJS  双向数据绑定详解简单实例
Oct 20 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
Feb 06 Javascript
mpvue小程序仿qq左滑置顶删除组件
Aug 03 Javascript
layDate日期控件使用方法详解
Nov 15 Javascript
Vue组件中prop属性使用说明实例代码详解
May 31 #Javascript
用JS实现根据当前时间随机生成流水号或者订单号
May 31 #Javascript
Vue2 轮播图slide组件实例代码
May 31 #Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
May 31 #Javascript
JavaScript 中的12种循环遍历方法【总结】
May 31 #Javascript
Vue 让元素抖动/摆动起来的实现代码
May 31 #Javascript
angular2路由之routerLinkActive指令【推荐】
May 30 #Javascript
You might like
关于在php.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
PHP令牌 Token改进版
2008/07/18 PHP
如何使用Strace调试工具
2013/06/03 PHP
php登陆页的密码处理方式分享
2013/10/14 PHP
PHP中round()函数对浮点数进行四舍五入的方法
2014/11/19 PHP
php进程间通讯实例分析
2016/07/11 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
2016/11/30 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
Bootstrap选项卡与Masonry插件的完美结合
2016/07/06 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
微信小程序实现翻牌抽奖动画
2020/09/21 Javascript
Python实现简单状态框架的方法
2015/03/19 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
python多进程使用及线程池的使用方法代码详解
2018/10/24 Python
Python接口测试文件上传实例解析
2020/05/22 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
护士2014年终工作总结
2014/11/11 职场文书
开幕式邀请函
2015/01/31 职场文书
员工辞职信范文
2015/03/02 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android
Beekeeper Studio开源数据库管理工具比Navicat更炫酷
2022/06/21 数据库