溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

nodejs中process對(duì)象的使用示例

發(fā)布時(shí)間:2021-02-20 10:14:50 來(lái)源:億速云 閱讀:229 作者:小新 欄目:web開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)nodejs中process對(duì)象的使用示例,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

process對(duì)象是一個(gè)全局對(duì)象,在任何地方都能訪問(wèn)到它,通過(guò)這個(gè)對(duì)象提供的屬性和方法,使我們可以對(duì)當(dāng)前運(yùn)行的程序的進(jìn)程進(jìn)行訪問(wèn)和控制。

概述

  process是一個(gè)全局對(duì)象,即global對(duì)象的屬性,可以在任何地方直接訪問(wèn)到它而無(wú)需引入額外模塊

console.log(process === global.process);//true
console.log(process);

nodejs中process對(duì)象的使用示例

屬性

【process.argv】

  包含命令行參數(shù)的數(shù)組。第一個(gè)元素會(huì)是'node',第二個(gè)元素將是.js文件的名稱,接下來(lái)的參數(shù)依次是命令行參數(shù)

console.log(process.argv);//[ 'D:\\nodejs\\node.exe', 'D:\\project\\main.js' ]

nodejs中process對(duì)象的使用示例

【process.execArgv】

  啟動(dòng)進(jìn)程所需的 node 命令行參數(shù)。這些參數(shù)不會(huì)在 process.argv 里出現(xiàn),并且不包含 node 執(zhí)行文件的名字,或者任何在名字之后的參數(shù)。這些用來(lái)生成子進(jìn)程,使之擁有和父進(jìn)程有相同的參數(shù)

console.log(process.execArgv);

nodejs中process對(duì)象的使用示例

【process.execPath】

  開啟當(dāng)前進(jìn)程的執(zhí)行文件的絕對(duì)路徑

console.log(process.execPath);//D:\nodejs\node.exe

【process.env】

  獲取當(dāng)前系統(tǒng)環(huán)境信息的對(duì)象,常規(guī)可以用來(lái)進(jìn)一步獲取環(huán)境變量、用戶名等系統(tǒng)信息

/*
{ PROCESSOR_ARCHITEW6432: 'AMD64',
  PROCESSOR_LEVEL: '6',
  COMMONPROGRAMW6432: 'C:\\Program Files\\Common Files',
  PROMPT: '$P$G',
  PSMODULEPATH: 'C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules\\',
  APPDATA: 'C:\\Users\\Administrator\\AppData\\Roaming',
  COMPUTERNAME: 'BAI',
  COMSPEC: 'C:\\WINDOWS\\system32\\cmd.exe',
  FPS_BROWSER_APP_PROFILE_STRING: 'Internet Explorer',
  USERPROFILE: 'C:\\Users\\Administrator',
  HOMEDRIVE: 'C:',
  USERNAME: 'Administrator',
  FP_NO_HOST_CHECK: 'NO',
  WINDIR: 'C:\\WINDOWS',
  PROCESSOR_REVISION: '3c03',
  FPS_BROWSER_USER_PROFILE_STRING: 'Default',
  TMP: 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp',
  _DFX_INSTALL_UNSIGNED_DRIVER: '1',
  PUBLIC: 'C:\\Users\\Public',
  'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files',
  NUMBER_OF_PROCESSORS: '8',
  SYSTEMROOT: 'C:\\WINDOWS',
  TEMP: 'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp',
  PROCESSOR_ARCHITECTURE: 'x86',
  LOCALAPPDATA: 'C:\\Users\\Administrator\\AppData\\Local',
  VISUALSVN_SERVER: 'D:\\soft\\svn1\\',
  COMMONPROGRAMFILES: 'C:\\Program Files (x86)\\Common Files',
  NODE_PATH: 'D:\\nodejs\\node_modules',
  ALLUSERSPROFILE: 'C:\\ProgramData',
  HOMEPATH: '\\Users\\Administrator',
  USERDOMAIN: 'BAI',
  WINDOWS_TRACING_LOGFILE: 'C:\\BVTBin\\Tests\\installpackage\\csilogfile.log',
  PROGRAMFILES: 'C:\\Program Files (x86)',
  VBOX_MSI_INSTALL_PATH: 'D:\\soft\\va\\',
  SYSTEMDRIVE: 'C:',
  PATH: 'C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files\\WIDCOMM\\Bluetooth Software\\;C:\\Program Files\\WIDCOMM\\Bluetooth Software\\syswow64;C:\\Program Files (x86)\\Microsoft SQL Server\\80\\Tools\\Binn\\;d:\\;D:\\nodejs;D:\\nodejs\\;D:\\Git\\cmd;D:\\soft\\svn1\\bin;D:\\soft\\svn2\\bin;C:\\Ruby23\\bin;D:\\soft\\Sublime Text 3\\less.js-windows-master;C:\\Users\\Administrator\\AppData\\Local\\Microsoft\\WindowsApps;D:\\wamp\\bin\\mysql\\mysql5.6.17\\bin;C:\\Users\\Administrator\\AppData\\Roaming\\npm',
  PROGRAMW6432: 'C:\\Program Files',
  PATHEXT: '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
  WINDOWS_TRACING_FLAGS: '3',
  PROCESSOR_IDENTIFIER: 'Intel64 Family 6 Model 60 Stepping 3, GenuineIntel',
  USERDOMAIN_ROAMINGPROFILE: 'BAI',
  LOGONSERVER: '\\\\BAI',
  PROGRAMDATA: 'C:\\ProgramData',
  SESSIONNAME: 'Console',
  'PROGRAMFILES(X86)': 'C:\\Program Files (x86)',
  OS: 'Windows_NT' }
 */
console.log(process.env);
console.log(process.env.USERNAME);//Administrator

【process.version】

  一個(gè)暴露編譯時(shí)存儲(chǔ)版本信息的內(nèi)置變量NODE_VERSION的屬性

console.log(process.version);//v6.9.2

【process.versions】

  一個(gè)暴露存儲(chǔ)node以及其依賴包版本信息的屬性

/*
{ http_parser: '2.7.0',
  node: '6.9.2',
  v8: '5.1.281.88',
  uv: '1.9.1',
  zlib: '1.2.8',
  ares: '1.10.1-DEV',
  icu: '57.1',
  modules: '48',
  openssl: '1.0.2j' }
 */
console.log(process.versions);

【process.pid】

  當(dāng)前進(jìn)程的 PID

setInterval(function(){
    console.log(process.pid);//11204}, 5000);

nodejs中process對(duì)象的使用示例

【process.arch】

  返回當(dāng)前CPU的架構(gòu)('arm'、'ia32' 或者 'x64')

console.log(process.arch);//ia32

【process.platform】

  運(yùn)行程序所在的平臺(tái)系統(tǒng) 'darwin', 'freebsd', 'linux', 'sunos' or 'win32'

console.log(process.platform); //win32

方法

【process.cwd】

   返回當(dāng)前進(jìn)程的工作目錄

console.log(process.cwd());//D:\project

【process.chdir(directory)】

  改變當(dāng)前工作進(jìn)程的目錄,如果操作失敗拋出異常

console.log(process.cwd());//D:\projecttry {
  process.chdir('./dist');
  console.log(process.cwd());//D:\project\dist}catch (err) {
  console.log('chdir: ' + err);
}

【process.memoryUsage()】

  返回一個(gè)對(duì)象,它描述了Node進(jìn)程的內(nèi)存使用情況,其單位是bytes

console.log(process.memoryUsage()); //{ rss: 18894848, heapTotal: 7274496, heapUsed: 3263160 }

【process.uptime()】

  返回 Node 程序已運(yùn)行的秒數(shù)

console.log(process.uptime());//0.139
var arr = new Array(200000000);
var s = arr.join(',');
console.log(process.uptime());//0.212

【process.hrtime()】

  返回當(dāng)前的高分辨時(shí)間,形式為 [秒,納秒] 的元組數(shù)組。它是相對(duì)于在過(guò)去的任意時(shí)間。該值與日期無(wú)關(guān),因此不受時(shí)鐘漂移的影響。主要用途是可以通過(guò)精確的時(shí)間間隔,來(lái)衡量程序的性能

var t1 = process.hrtime();
var arr = new Array(200000000),
    s = arr.join(',');
var t2 = process.hrtime();
//處理數(shù)組共花費(fèi)了0秒,詳細(xì)為64756416納秒
console.log('處理數(shù)組共花費(fèi)了%d秒,詳細(xì)為%d納秒', (t2[0] - t1[0]), (t2[1] - t1[1]));

【process.kill(pid, [signal])】

  結(jié)束對(duì)應(yīng)某pid的進(jìn)程并發(fā)送一個(gè)信號(hào)(若沒(méi)定義信號(hào)值則默認(rèn)為'SIGTERM')

console.log(process.pid);//19960
process.kill(process.pid, 'SIGTERM');
console.log(process.pid);//''

【process.abort()】

  觸發(fā)node的abort事件,退出當(dāng)前進(jìn)程

process.abort();
console.log('在輸出這句話之前就退出了');

【process.exit([code])】

  終止當(dāng)前進(jìn)程并返回給定的code。如果省略了code,退出時(shí)會(huì)默認(rèn)返回成功的狀態(tài)碼('success' code) 也就是0

process.exit(); //[Finished in 0.2s]
process.exit(1); //[Finished in 0.2s with exit code 1]

  更多的返回狀態(tài)碼可參考下方列表

1 未捕獲的致命異常(Uncaught Fatal Exception) - There was an uncaught exception, and it was not handled by a domain or an uncaughtException event handler.
2 - 未使用(Unused) (reserved by Bash for builtin misuse)
3 解析錯(cuò)誤(Internal JavaScript Parse Error) - The JavaScript source code internal in Node's bootstrapping process caused a parse error. This is extremely rare, and generally can only happen during development of Node itself.
4 評(píng)估失敗(Internal JavaScript Evaluation Failure) - The JavaScript source code internal in Node's bootstrapping process failed to return a function value when evaluated. This is extremely rare, and generally can only happen during development of Node itself.
5 致命錯(cuò)誤(Fatal Error) - There was a fatal unrecoverable error in V8. Typically a message will be printed to stderr with the prefix FATAL ERROR.
6 未正確的異常處理(Non-function Internal Exception Handler) - There was an uncaught exception, but the internal fatal exception handler function was somehow set to a non-function, and could not be called.
7 異常處理函數(shù)運(yùn)行時(shí)失敗(Internal Exception Handler Run-Time Failure) - There was an uncaught exception, and the internal fatal exception handler function itself threw an error while attempting to handle it. This can happen, for example, if a process.on('uncaughtException') or domain.on('error') handler throws an error.
8 - 未使用(Unused). In previous versions of Node, exit code 8 sometimes indicated an uncaught exception.
9 - 無(wú)效的參數(shù)(Invalid Argument) - Either an unknown option was specified, or an option requiring a value was provided without a value.
10 運(yùn)行時(shí)失敗(Internal JavaScript Run-Time Failure) - The JavaScript source code internal in Node's bootstrapping process threw an error when the bootstrapping function was called. This is extremely rare, and generally can only happen during development of Node itself.
12 無(wú)效的調(diào)試參數(shù)(Invalid Debug Argument) - The --debug and/or --debug-brk options were set, but an invalid port number was chosen.
>128 信號(hào)退出(Signal Exits) - If Node receives a fatal signal such as SIGKILL or SIGHUP, then its exit code will be 128 plus the value of the signal code. This is a standard Unix practice, since exit codes are defined to be 7-bit integers, and signal exits set the high-order bit, and then contain the value of the signal code.

【process.exitCode】

  可以自定義退出進(jìn)程時(shí)node shell捕獲到的狀態(tài)碼(必須是正常結(jié)束進(jìn)程或者使用process.exit()指令退出)

  [注意]如果指明了 process.exit(code) 中退出的錯(cuò)誤碼 (code),則會(huì)覆蓋掉 process.exitCode 的設(shè)置

process.exitCode = 4;
process.exit();//[Finished in 0.2s with exit code 4]
process.exitCode = 4;
process.exit(2);//[Finished in 0.2s with exit code 2]

輸入輸出流

【process.stdout】

  一個(gè)指向標(biāo)準(zhǔn)輸出流(stdout)的可寫的流(Writable Stream)

/*這是一行數(shù)據(jù)
這是第二行數(shù)據(jù) */process.stdout.write('這是一行數(shù)據(jù)\n這是第二行數(shù)據(jù)');

【process.stderr】

  一個(gè)指向標(biāo)準(zhǔn)錯(cuò)誤流(stderr)的 可寫的流(Writable Stream)

//輸出一行標(biāo)準(zhǔn)錯(cuò)誤流,效果跟stdout沒(méi)差[Finished in 0.2s]
process.stderr.write('輸出一行標(biāo)準(zhǔn)錯(cuò)誤流,效果跟stdout沒(méi)差');

【process.stdin】

  一個(gè)指向標(biāo)準(zhǔn)輸入流(stdin)的可讀流(Readable Stream)。標(biāo)準(zhǔn)輸入流默認(rèn)是暫停(pause)的,所以必須要調(diào)用process.stdin.resume()來(lái)恢復(fù)(resume)接收

process.stdin.resume();
var a,b;
process.stdout.write('請(qǐng)輸入a的值: ');
process.stdin.on('data',function(data){
    if(a == undefined){
        a = Number(data);
        process.stdout.write('請(qǐng)輸入b的值: ');
    }else{    
        b = Number(data);
        process.stdout.write('結(jié)果是: ' + (a+b));
        process.exit();
    }

    
})

nodejs中process對(duì)象的使用示例

事件

【事件'exit'】

  當(dāng)進(jìn)程將要退出時(shí)觸發(fā)。這是一個(gè)在固定時(shí)間檢查模塊狀態(tài)(如單元測(cè)試)的好時(shí)機(jī)。需要注意的是 'exit' 的回調(diào)結(jié)束后,主事件循環(huán)將不再運(yùn)行,所以計(jì)時(shí)器也會(huì)失效

/*
1
退出前執(zhí)行
 */
process.on('exit', function() {
    // 設(shè)置一個(gè)延遲執(zhí)行
    setTimeout(function() {
        console.log('主事件循環(huán)已停止,所以不會(huì)執(zhí)行');
    }, 0);
    console.log('退出前執(zhí)行');
});
setTimeout(function() {
    console.log('1');
}, 500);

【事件'uncaughtException'】

  捕獲那些沒(méi)有try catch的異常錯(cuò)誤

//捕獲到一個(gè)異常
process.on('uncaughtException', function() {
    console.log('捕獲到一個(gè)異常');
});
var a = '123';
a.a(); //觸發(fā)異常事件
console.log('這句話不會(huì)顯示出來(lái)');

【事件'SIGINT'】

  捕獲當(dāng)前進(jìn)程接收到的信號(hào)(如按下了 ctrl + c)

process.on('SIGINT', function() {
    console.log('收到 SIGINT 信號(hào)。');
});
console.log('試著按下 ctrl + C');
setTimeout(function() {
    console.log('end');
}, 50000);

nodejs中process對(duì)象的使用示例

nextTick

【process.nextTick(callback)】

  該方法算是 process 對(duì)象最重要的一個(gè)屬性方法了,表示在事件循環(huán)(EventLoop)的下一次循環(huán)中調(diào)用 callback 回調(diào)函數(shù)。這不是 setTimeout(fn, 0) 函數(shù)的一個(gè)簡(jiǎn)單別名,因?yàn)樗男矢叨嗔?。該函?shù)能在任何 I/O 事前之前調(diào)用回調(diào)函數(shù)。如果想要在對(duì)象創(chuàng)建之后而I/O操作發(fā)生之前執(zhí)行某些操作,那么這個(gè)函數(shù)就十分重要了

  Node.js是單線程的,除了系統(tǒng)IO之外,在它的事件輪詢過(guò)程中,同一時(shí)間只會(huì)處理一個(gè)事件。可以把事件輪詢想象成一個(gè)大的隊(duì)列,在每個(gè)時(shí)間點(diǎn)上,系統(tǒng)只會(huì)處理一個(gè)事件。即使電腦有多個(gè)CPU核心,也無(wú)法同時(shí)并行的處理多個(gè)事件。但也就是這種特性使得node.js適合處理I/O型的應(yīng)用。在每個(gè)I/O型的應(yīng)用中,只需要給每一個(gè)輸入輸出定義一個(gè)回調(diào)函數(shù)即可,他們會(huì)自動(dòng)加入到事件輪詢的處理隊(duì)列里。當(dāng)I/O操作完成后,這個(gè)回調(diào)函數(shù)會(huì)被觸發(fā)。然后系統(tǒng)會(huì)繼續(xù)處理其他的請(qǐng)求

  在這種處理模式下,process.nextTick()的意思就是定義出一個(gè)動(dòng)作,并且讓這個(gè)動(dòng)作在下一個(gè)事件輪詢的時(shí)間點(diǎn)上執(zhí)行

function foo() {
    console.error('foo');
}
 
process.nextTick(foo);
console.error('bar');/*bar
foo*/

  也可以使用setTimeout()函數(shù)來(lái)達(dá)到貌似同樣的執(zhí)行效果

setTimeout(foo, 0);
console.log('bar');

  但在內(nèi)部的處理機(jī)制上,process.nextTick()和setTimeout(fn, 0)是不同的,process.nextTick()不是一個(gè)單純的延時(shí),它有更多的特性。更精確的說(shuō),process.nextTick()定義的調(diào)用會(huì)創(chuàng)建一個(gè)新的子堆棧。在當(dāng)前的棧里,可以執(zhí)行任意多的操作。但一旦調(diào)用nextTick,函數(shù)就必須返回到父堆棧。然后事件輪詢機(jī)制又重新等待處理新的事件,如果發(fā)現(xiàn)nextTick的調(diào)用,就會(huì)創(chuàng)建一個(gè)新的棧。

  在下面的例子里有一個(gè)compute(),我們希望這個(gè)函數(shù)盡可能持續(xù)的執(zhí)行,來(lái)進(jìn)行一些運(yùn)算密集的任務(wù)。但與此同時(shí),我們還希望系統(tǒng)不要被這個(gè)函數(shù)堵塞住,還需要能響應(yīng)處理別的事件。這個(gè)應(yīng)用模式就像一個(gè)單線程的web服務(wù)server。在這里我們就可以使用process.nextTick()來(lái)交叉執(zhí)行compute()和正常的事件響應(yīng)

var http = require('http');
function compute() {
    // performs complicated calculations continuously
    process.nextTick(compute);
}
http.createServer(function(req, res) {
     res.writeHead(200, {'Content-Type': 'text/plain'});
     res.end('Hello World');
}).listen(5000, '127.0.0.1');
compute();

  在這種模式下,我們不需要遞歸的調(diào)用compute(),只需要在事件循環(huán)中使用process.nextTick()定義compute()在下一個(gè)時(shí)間點(diǎn)執(zhí)行即可。在這個(gè)過(guò)程中,如果有新的http請(qǐng)求進(jìn)來(lái),事件循環(huán)機(jī)制會(huì)先處理新的請(qǐng)求,然后再調(diào)用compute()。反之,如果把compute()放在一個(gè)遞歸調(diào)用里,那系統(tǒng)就會(huì)一直阻塞在compute()里,無(wú)法處理新的http請(qǐng)求了

  當(dāng)然,我們無(wú)法通過(guò)process.nextTick()來(lái)獲得多CPU下并行執(zhí)行的真正好處,這只是模擬同一個(gè)應(yīng)用在CPU上分段執(zhí)行而已

【總結(jié)】

  Nodejs的特點(diǎn)是事件驅(qū)動(dòng),異步I/O產(chǎn)生的高并發(fā),產(chǎn)生此特點(diǎn)的引擎是事件循環(huán),事件被分門別類地歸到對(duì)應(yīng)的事件觀察者上,比如idle觀察者,定時(shí)器觀察者,I/O觀察者等等,事件循環(huán)每次循環(huán)稱為Tick,每次Tick按照先后順序從事件觀察者中取出事件進(jìn)行處理

  調(diào)用setTimeout()或setInterval()時(shí)創(chuàng)建的計(jì)時(shí)器會(huì)被放入定時(shí)器觀察者內(nèi)部的紅黑樹中,每次Tick時(shí),會(huì)從該紅黑樹中檢查定時(shí)器是否超過(guò)定時(shí)時(shí)間,超過(guò)的話,就立即執(zhí)行對(duì)應(yīng)的回調(diào)函數(shù)。setTimeout()和setInterval()都是當(dāng)定時(shí)器使用,他們的區(qū)別在于后者是重復(fù)觸發(fā),而且由于時(shí)間設(shè)的過(guò)短會(huì)造成前一次觸發(fā)后的處理剛完成后一次就緊接著觸發(fā)

  由于定時(shí)器是超時(shí)觸發(fā),這會(huì)導(dǎo)致觸發(fā)精確度降低,比如用setTimeout設(shè)定的超時(shí)時(shí)間是5秒,當(dāng)事件循環(huán)在第4秒循到了一個(gè)任務(wù),它的執(zhí)行時(shí)間3秒的話,那么setTimeout的回調(diào)函數(shù)就會(huì)過(guò)期2秒執(zhí)行,這就是造成精度降低的原因。并且由于采用紅黑樹和迭代的方式保存定時(shí)器和判斷觸發(fā),較為浪費(fèi)性能

  使用process.nextTick()所設(shè)置的所有回調(diào)函數(shù)都會(huì)放置在數(shù)組中,會(huì)在下一次Tick時(shí)所有的都立即被執(zhí)行,該操作較為輕量,時(shí)間精度高

  setImmediate()設(shè)置的回調(diào)函數(shù)也是在下一次Tick時(shí)被調(diào)用,其和process.nextTick()的區(qū)別在于兩點(diǎn):

    1、所屬的觀察者被執(zhí)行的優(yōu)先級(jí)不一樣,process.nextTick()屬于idle觀察者,setImmediate()屬于check觀察者,idle的優(yōu)先級(jí)>check

      2、setImmediate()設(shè)置的回調(diào)函數(shù)是放置在一個(gè)鏈表中,每次Tick只執(zhí)行鏈表中的一個(gè)回調(diào)。這是為了保證每次Tick都能快速地被執(zhí)行

關(guān)于“nodejs中process對(duì)象的使用示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI