欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解阿里Node.js技術(shù)文檔之process模塊學(xué)習(xí)指南

 更新時間:2021年01月04日 09:49:04   作者:不會CSS的程序員  
這篇文章主要介紹了詳解阿里Node.js技術(shù)文檔之process模塊學(xué)習(xí)指南,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

模塊概覽

process是node的全局模塊,作用比較直觀。可以通過它來獲得node進程相關(guān)的信息,比如運行node程序時的命令行參數(shù)?;蛘咴O(shè)置進程相關(guān)信息,比如設(shè)置環(huán)境變量。

環(huán)境變量:process.env

使用頻率很高,node服務(wù)運行時,時常會判斷當(dāng)前服務(wù)運行的環(huán)境,如下所示

if(process.env.NODE_ENV === 'production'){
  console.log('生產(chǎn)環(huán)境');
}else{
  console.log('非生產(chǎn)環(huán)境');
}

運行命令 NODE_ENV=production node env.js,輸出如下

非生產(chǎn)環(huán)境

異步:process.nextTick(fn)

使用頻率同樣很高,通常用在異步的場景,來個簡單的栗子:

console.log('海賊王');
process.nextTick(function(){
  console.log('火影忍者');
});
console.log('死神');

// 輸出如下
// 海賊王
// 死神
// 火影忍者

process.nextTick(fn) 咋看跟 setTimeout(fn, 0) 很像,但實際有實現(xiàn)及性能上的差異,我們先記住幾個點:

  • process.nextTick(fn) 將 fn 放到 node 事件循環(huán)的 下一個tick 里;
  • process.nextTick(fn) 比 setTimetout(fn, 0) 性能高;

獲取命令行參數(shù):process.argv

process.argv 返回一個數(shù)組,數(shù)組元素分別如下:

  • 元素1:node
  • 元素2:可執(zhí)行文件的絕對路徑
  • 元素x:其他,比如參數(shù)等
// print process.argv
process.argv.forEach(function(val, index, array) {
 console.log('參數(shù)' + index + ': ' + val);
});

運行命令 NODE_ENV=dev node argv.js --env production,輸出如下。(不包含環(huán)境變量)

參數(shù)0: /Users/a/.nvm/versions/node/v6.1.0/bin/node
參數(shù)1: /Users/a/Documents/argv.js
參數(shù)2: --env
參數(shù)3: production

獲取node specific參數(shù):process.execArgv

跟 process.argv 看著像,但差異很大。它會返回 node specific 的參數(shù)(也就是運行node程序特有的參數(shù)啦,比如 --harmony)。這部分參數(shù)不會出現(xiàn)在 process.argv 里。

我們來看個例子,相當(dāng)直觀。輸入命令 node --harmony execArgv.js --nick chyingp, execArgv.js 代碼如下:

process.execArgv.forEach(function(val, index, array) {
 console.log(index + ': ' + val);
});
// 輸出:
// 0: --harmony

process.argv.forEach(function(val, index, array) {
 console.log(index + ': ' + val);
});
// 輸出:
// 0: /Users/a/.nvm/versions/node/v6.1.0/bin/node
// 1: /Users/a/Documents/execArgv.js
// 2: --nick
// 3: chyingp

當(dāng)前工作路徑:process.cwd() vs process.chdir(directory)

  • process.cwd():返回當(dāng)前工作路徑
  • process.chdir(directory):切換當(dāng)前工作路徑

工作路徑的用途不用過多解釋了,直接上代碼:

console.log('Starting directory: ' + process.cwd());
try {
 process.chdir('/tmp');
 console.log('New directory: ' + process.cwd());
}
catch (err) {
 console.log('chdir: ' + err);
}

輸出如下:

Starting directory: /Users/a/Documents/2016.11.22-node-process
New directory: /private/tmp

IPC相關(guān)

  • process.connected:如果當(dāng)前進程是子進程,且與父進程之間通過IPC通道連接著,則為true;
  • process.disconnect():斷開與父進程之間的IPC通道,此時會將 process.connected 置為false;

首先是 connected.js,通過 fork 創(chuàng)建子進程(父子進程之間創(chuàng)建了IPC通道)

var child_process = require('child_process');

child_process.fork('./connectedChild.js', {
 stdio: 'inherit'
});

然后,在 connectedChild.js 里面。

console.log( 'process.connected: ' + process.connected );
process.disconnect();
console.log( 'process.connected: ' + process.connected );

// 輸出:
// process.connected: true
// process.connected: false

其他

process.config:跟node的編譯配置參數(shù)有關(guān)

標(biāo)準(zhǔn)輸入/標(biāo)準(zhǔn)輸出/標(biāo)準(zhǔn)錯誤輸出:process.stdin、process.stdout

process.stdin、process.stdout、process.stderr 分別代表進程的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)錯誤輸出??垂倬W(wǎng)的例子

process.stdin.setEncoding('utf8');

process.stdin.on('readable', () => {
 var chunk = process.stdin.read();
 if (chunk !== null) {
  process.stdout.write(`data: ${chunk}`);
 }
});

process.stdin.on('end', () => {
 process.stdout.write('end');
});

執(zhí)行程序,可以看到,程序通過 process.stdin 讀取用戶輸入的同時,通過 process.stdout 將內(nèi)容輸出到控制臺

hello
data: hello
world
data: world

process.stderr也差不多,讀者可以自己試下。

用戶組/用戶 相關(guān)

process.seteuid(id): process.geteuid():獲得當(dāng)前用戶的id。(POSIX平臺上才有效)
process.getgid(id) process.getgid():獲得當(dāng)前群組的id。(POSIX平臺上才有效,群組、有效群組 的區(qū)別,請自行谷歌)
process.setegid(id) process.getegid():獲得當(dāng)前有效群組的id。(POSIX平臺上才有效)
process.setroups(groups): process.getgroups():獲得附加群組的id。(POSIX平臺上才有效,
process.setgroups(groups): process.setgroups(groups):
process.initgroups(user, extra_group):

當(dāng)前進程信息

  • process.pid:返回進程id。
  • process.title:可以用它來修改進程的名字,當(dāng)你用ps命令,同時有多個node進程在跑的時候,作用就出來了。

運行情況/資源占用情況

process.uptime():當(dāng)前node進程已經(jīng)運行了多長時間(單位是秒)。

process.memoryUsage():返回進程占用的內(nèi)存,單位為字節(jié)。輸出內(nèi)容大致如下:

{ 
  rss: 19181568, 
  heapTotal: 8384512, // V8占用的內(nèi)容
  heapUsed: 4218408 // V8實際使用了的內(nèi)存
}

process.cpuUsage([previousValue]):CPU使用時間耗時,單位為毫秒。user表示用戶程序代碼運行占用的時間,system表示系統(tǒng)占用時間。如果當(dāng)前進程占用多個內(nèi)核來執(zhí)行任務(wù),那么數(shù)值會比實際感知的要大。官方例子如下:

const startUsage = process.cpuUsage();
// { user: 38579, system: 6986 }

// spin the CPU for 500 milliseconds
const now = Date.now();
while (Date.now() - now < 500);

console.log(process.cpuUsage(startUsage));
// { user: 514883, system: 11226 }

process.hrtime():一般用于做性能基準(zhǔn)測試。返回一個數(shù)組,數(shù)組里的值為 [[seconds, nanoseconds] (1秒等10的九次方毫微秒)。 注意,這里返回的值,是相對于過去一個隨機的時間,所以本身沒什么意義。僅當(dāng)你將上一次調(diào)用返回的值做為參數(shù)傳入,才有實際意義。

把官網(wǎng)的例子稍做修改:

var time = process.hrtime();

setInterval(() => {
 var diff = process.hrtime(time);

 console.log(`Benchmark took ${diff[0] * 1e9 + diff[1]} nanoseconds`);
}, 1000);

輸出大概如下:

Benchmark took 1006117293 nanoseconds
Benchmark took 2049182207 nanoseconds
Benchmark took 3052562935 nanoseconds
Benchmark took 4053410161 nanoseconds
Benchmark took 5056050224 nanoseconds

node可執(zhí)行程序相關(guān)信息

process.version:返回當(dāng)前node的版本,比如'v6.1.0'。

process.versions:返回node的版本,以及依賴庫的版本,如下所示。

{ http_parser: '2.7.0',
 node: '6.1.0',
 v8: '5.0.71.35',
 uv: '1.9.0',
 zlib: '1.2.8',
 ares: '1.10.1-DEV',
 icu: '56.1',
 modules: '48',
 openssl: '1.0.2h' }

process.release:返回當(dāng)前node發(fā)行版本的相關(guān)信息,大部分時候不會用到。具體字段含義可以看這里。

{
 name: 'node',
 lts: 'Argon',
 sourceUrl: 'https://nodejs.org/download/release/v4.4.5/node-v4.4.5.tar.gz',
 headersUrl: 'https://nodejs.org/download/release/v4.4.5/node-v4.4.5-headers.tar.gz',
 libUrl: 'https://nodejs.org/download/release/v4.4.5/win-x64/node.lib'
}

process.config:返回當(dāng)前 node版本 編譯時的參數(shù),同樣很少會用到,一般用來查問題。

process.execPath:node可執(zhí)行程序的絕對路徑,比如 '/usr/local/bin/node'

進程運行所在環(huán)境

process.arch:返回當(dāng)前系統(tǒng)的處理器架構(gòu)(字符串),比如'arm', 'ia32', or 'x64'。

process.platform:返回關(guān)于平臺描述的字符串,比如 darwin、win32 等。

警告信息:process.emitWarning(warning);

v6.0.0新增的接口,可以用來拋出警告信息。最簡單的例子如下,只有警告信息

process.emitWarning('Something happened!');
// (node:50215) Warning: Something happened!

可以給警告信息加個名字,便于分類

process.emitWarning('Something Happened!', 'CustomWarning');
// (node:50252) CustomWarning: Something Happened!

可以對其進行監(jiān)聽

process.emitWarning('Something Happened!', 'CustomWarning');

process.on('warning', (warning) => {
 console.warn(warning.name);
 console.warn(warning.message);
 console.warn(warning.stack);
});

/*
(node:50314) CustomWarning: Something Happened!
CustomWarning
Something Happened!
CustomWarning: Something Happened!
  at Object.<anonymous> (/Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.22-node-process/emitWarning.js:3:9)
  at Module._compile (module.js:541:32)
  at Object.Module._extensions..js (module.js:550:10)
  at Module.load (module.js:456:32)
  at tryModuleLoad (module.js:415:12)
  at Function.Module._load (module.js:407:3)
  at Function.Module.runMain (module.js:575:10)
  at startup (node.js:160:18)
  at node.js:445:3
*/ 

也可以直接給個Error對象

const myWarning = new Error('Warning! Something happened!');
myWarning.name = 'CustomWarning';

process.emitWarning(myWarning);

向進程發(fā)送信號:process.kill(pid, signal)

process.kill() 這個方法名可能會讓初學(xué)者感到困惑,其實它并不是用來殺死進程的,而是用來向進程發(fā)送信號。舉個例子:

console.log('hello');

process.kill(process.pid, 'SIGHUP');

console.log('world');

輸出如下,可以看到,最后一行代碼并沒有執(zhí)行,因為向當(dāng)前進程發(fā)送 SIGHUP 信號,進程退出所致。

hello
[1]    50856 hangup     node kill.js

可以通過監(jiān)聽 SIGHUP 事件,來阻止它的默認(rèn)行為。

process.on('SIGHUP', () => {
 console.log('Got SIGHUP signal.');
});

console.log('hello');

process.kill(process.pid, 'SIGHUP');

console.log('world');

測試結(jié)果比較意外,輸出如下:(osx 10.11.4),SIGHUP 事件回調(diào)里的內(nèi)容并沒有輸出。

hello
world

猜測是因為寫標(biāo)準(zhǔn)輸出被推到下一個事件循環(huán)導(dǎo)致(類似process.exit()小節(jié)提到的),再試下

process.on('SIGHUP', () => {
 console.log('Got SIGHUP signal.');
});

setTimeout(function(){
 console.log('Exiting.');
}, 0);

console.log('hello');

process.kill(process.pid, 'SIGHUP');

console.log('world');

輸出如下(其實并不能說明什么。。。知道真相的朋友請舉手。。。)

hello
world
Exiting.
Got SIGHUP signal.

終止進程:process.exit([exitCode])、process.exitCode

  • process.exit([exitCode]) 可以用來立即退出進程。即使當(dāng)前有操作沒執(zhí)行完,比如 process.exit() 的代碼邏輯,或者未完成的異步邏輯。
  • 寫數(shù)據(jù)到 process.stdout 之后,立即調(diào)用 process.exit() 是不保險的,因為在node里面,往 stdout 寫數(shù)據(jù)是非阻塞的,可以跨越多個事件循環(huán)。于是,可能寫到一半就跪了。比較保險的做法是,通過process.exitCode設(shè)置退出碼,然后等進程自動退出。
  • 如果程序出現(xiàn)異常,必須退出不可,那么,可以拋出一個未被捕獲的error,來終止進程,這個比 process.exit() 安全。

來段官網(wǎng)的例子鎮(zhèn)樓:

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
 printUsageToStdout();
 process.exitCode = 1;
}

備注:整個 process.exit() 的接口說明,都在告訴我們 process.exit() 這個接口有多不可靠。。。還用嗎。。。

事件

  • beforeExit:進程退出之前觸發(fā),參數(shù)為 exitCode。(此時eventLoop已經(jīng)空了)如果是顯式調(diào)用 process.exit()退出,或者未捕獲的異常導(dǎo)致退出,那么 beforeExit 不會觸發(fā)。(我要,這事件有何用。。。)
  • exit:

TODO 待進一步驗證

官方文檔里,對于 process.nextTick(fn) 有如下描述,如何構(gòu)造用例進行測試?

It runs before any additional I/O events (including timers) fire in subsequent ticks of the event loop.

process.channel:實際測試結(jié)果,即使父、子進程間存在IPC通道,process.channel 的值依舊是undefined.(測試方法有問題?)

到此這篇關(guān)于詳解阿里Node.js技術(shù)文檔之process模塊學(xué)習(xí)指南的文章就介紹到這了,更多相關(guān)Node.js process模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 在windows上用nodejs搭建靜態(tài)文件服務(wù)器的簡單方法

    在windows上用nodejs搭建靜態(tài)文件服務(wù)器的簡單方法

    這篇文章主要介紹了在windows上用nodejs搭建靜態(tài)文件服務(wù)器的簡單方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • nodejs入門教程四:URL相關(guān)模塊用法分析

    nodejs入門教程四:URL相關(guān)模塊用法分析

    這篇文章主要介紹了nodejs入門教程四之URL相關(guān)模塊用法,較為詳細的分析了URL相關(guān)模塊功能、方法與使用技巧,需要的朋友可以參考下
    2017-04-04
  • Node.js中如何合并兩個復(fù)雜對象詳解

    Node.js中如何合并兩個復(fù)雜對象詳解

    下面這篇文章主要給大家介紹了在Node.js中如何合并兩個復(fù)雜對象的方法,文中給出了詳細的示例代碼,相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,有需要的朋友可以參考,下面來一起看看吧。
    2016-12-12
  • Nodejs的express使用教程

    Nodejs的express使用教程

    Express 是一個簡潔、靈活的 node.js Web 應(yīng)用開發(fā)框架, 它提供一系列強大的特性,幫助你創(chuàng)建各種 Web 和移動設(shè)備應(yīng)用,本篇文章給大家介紹nodejs的express使用教程,感興趣的朋友參考下
    2015-11-11
  • 開箱即用的Node.js+Mysql模塊封裝實現(xiàn)詳解

    開箱即用的Node.js+Mysql模塊封裝實現(xiàn)詳解

    這篇文章主要為大家介紹了開箱即用的Node.js+Mysql模塊封裝實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • ChatGPT編程秀之最小元素的設(shè)計示例詳解

    ChatGPT編程秀之最小元素的設(shè)計示例詳解

    這篇文章主要為大家介紹了ChatGPT編程秀之最小元素的設(shè)計示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • node.js中的http.response.removeHeader方法使用說明

    node.js中的http.response.removeHeader方法使用說明

    這篇文章主要介紹了node.js中的http.response.removeHeader方法使用說明,本文介紹了http.response.removeHeader的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Centos7 安裝Node.js10以上版本的方法步驟

    Centos7 安裝Node.js10以上版本的方法步驟

    這篇文章主要介紹了Centos7 安裝Node.js10以上版本的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Node.js 實現(xiàn)簡單小說爬蟲實例

    Node.js 實現(xiàn)簡單小說爬蟲實例

    現(xiàn)在爬蟲在很多web項目中都有應(yīng)用,這篇文章主要介紹了Node.js 實現(xiàn)簡單小說爬蟲實例,有興趣的可以了解一下。
    2016-11-11
  • express.js中間件說明詳解

    express.js中間件說明詳解

    這篇文章主要介紹了express.js中間件說明詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評論