首頁 >web前端 >js教程 >Node.js筆記process模組使用詳解

Node.js筆記process模組使用詳解

php中世界最好的语言
php中世界最好的语言原創
2018-06-01 09:46:001647瀏覽

這次帶給大家Node.js筆記process模組使用詳解,Node.js筆記process模組使用的注意事項有哪些,下面就是實戰案例,一起來看一下。

process存在於全域物件上,不需要使用require()載入即可使用,process模組主要做兩方面的事情

  1. 讀取:取得進程資訊(資源使用、運作環境、運作狀態)

  2. 寫入:執行行程操作(監聽事件、調度任務、發出警告)資源使用

資源使用

指執行此程序所消耗的機器資源。例如記憶體、cpu

記憶體

process.memoryUsage())
{ rss: 21848064,
 heapTotal: 7159808,
 heapUsed: 4431688,
 external: 8224 
 }

rss(常駐記憶體)的組成見下圖

## 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、uncaught

Exception、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见下图,后面会做进一步详细的讲解

发出警告

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

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

怎么使用webpack3.0配置webpack-dev-server

JS反射与依赖注入使用案例分析

以上是Node.js筆記process模組使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn