成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Node.js process模塊解讀

Riddler / 2840人閱讀

摘要:默認(rèn)情況下,會(huì)打印堆棧信息到然后退出進(jìn)程。適用于父子進(jìn)程之間發(fā)送消息,關(guān)于如何創(chuàng)建父子進(jìn)程會(huì)放在模塊中進(jìn)行。信號(hào)雖然也是用于請(qǐng)求終止進(jìn)程,但是它與有所不同,進(jìn)程可以選擇響應(yīng)還是忽略此信號(hào)。

process存在于全局對(duì)象上,不需要使用require()加載即可使用,process模塊主要做兩方面的事情

讀:獲取進(jìn)程信息(資源使用、運(yùn)行環(huán)境、運(yùn)行狀態(tài))

寫:執(zhí)行進(jìn)程操作(監(jiān)聽事件、調(diào)度任務(wù)、發(fā)出警告)

資源使用

資源使用指運(yùn)行此進(jìn)程所消耗的機(jī)器資源。例如內(nèi)存、cpu

內(nèi)存
process.memoryUsage())

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

rss(常駐內(nèi)存)的組成見下圖

code segment對(duì)應(yīng)當(dāng)前運(yùn)行的代碼

external對(duì)應(yīng)的是C++對(duì)象(與V8管理的JS對(duì)象綁定)的占用的內(nèi)存,比如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)); //相對(duì)時(shí)間

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

user對(duì)應(yīng)用戶時(shí)間,system代表系統(tǒng)時(shí)間

運(yùn)行環(huán)境

運(yùn)行環(huán)境指此進(jìn)程運(yùn)行的宿主環(huán)境包括運(yùn)行目錄、node環(huán)境、CPU架構(gòu)、用戶環(huán)境、系統(tǒng)平臺(tái)

運(yùn)行目錄
console.log(`Current directory: ${process.cwd()}`);

// Current directory: /Users/xxxx/workspace/learn/node-basic/process
node環(huán)境
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架構(gòu)
console.log(`This processor architecture is ${process.arch}`);

// This processor architecture is x64

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

用戶環(huán)境
console.log(process.env.NODE_ENV); // dev

NODE_ENV=dev node b.js

除了啟動(dòng)時(shí)的自定義信息之外,process.env還可以獲得其他的用戶環(huán)境信息(比如PATH、SHELL、HOME等),感興趣的可以自己打印一下試試

系統(tǒng)平臺(tái)
console.log(`This platform is ${process.platform}`);

This platform is darwin

支持的系統(tǒng)平臺(tái)包括:"aix" "darwin" "freebsd" "linux" "openbsd" "sunos" "win32"

android目前還處于試驗(yàn)階段

運(yùn)行狀態(tài)

運(yùn)行狀態(tài)指當(dāng)前進(jìn)程的運(yùn)行相關(guān)的信息包括啟動(dòng)參數(shù)、執(zhí)行目錄、主文件、PID信息、運(yùn)行時(shí)間

啟動(dòng)參數(shù)

獲取啟動(dòng)參數(shù)有三個(gè)方法,execArgv獲取Node.js的命令行選項(xiàng)(見官網(wǎng)文檔)

argv獲取非命令行選項(xiàng)的信息,argv0則獲取argv[0]的值(略有差異)

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

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

// 輸出結(jié)果
[ "/Users/xiji/.nvm/versions/node/v9.1.0/bin/node",
  "/Users/xiji/workspace/learn/node-basic/process/b.js",
  "foo=bar",
  "--version" ]
node
[ "--harmony" ]
執(zhí)行目錄
console.log(process.execPath);

// /Users/xxxx/.nvm/versions/node/v9.1.0/bin/node
運(yùn)行時(shí)間
var date = new Date();
while(new Date() - date < 500) {}
console.log(process.uptime()); // 0.569
主文件

除了require.main之外也可以通過process.mainModule來判斷一個(gè)模塊是否是主文件

//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
監(jiān)聽事件

process是EventEmiiter的實(shí)例對(duì)象,因此可以使用process.on("eventName", () => {})來監(jiān)聽事件。
常用的事件類型分兩種:

進(jìn)程狀態(tài) 比如:beforeExit、exit、uncaughtException、message

信號(hào)事件 比如:SIGTERM、SIGKILL、SIGUSR1

beforeExit與exit的區(qū)別有兩方面:

beforeExit里面可以執(zhí)行異步代碼、exit只能是同步代碼

手動(dòng)調(diào)用process.exit()或者觸發(fā)uncaptException導(dǎo)致進(jìn)程退出不會(huì)觸發(fā)beforeExit事件、exit事件會(huì)觸發(fā)。

因此下面的代碼console都不會(huì)被執(zhí)行

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

當(dāng)異常一直沒有被捕獲處理的話,最后就會(huì)觸發(fā)"uncaughtException"事件。默認(rèn)情況下,Node.js會(huì)打印堆棧信息到stderr然后退出進(jìn)程。不要試圖阻止uncaughtException退出進(jìn)程,因此此時(shí)程序的狀態(tài)可能已經(jīng)不穩(wěn)定了,建議的方式是及時(shí)捕獲處理代碼中的錯(cuò)誤,uncaughtException里面只做一些清理工作。

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

當(dāng)process.setUncaughtExceptionCaptureCallback(fn)指定了監(jiān)聽函數(shù)的時(shí)候,uncaughtException事件將會(huì)不再被觸發(fā)。

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

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

a.b();
// uncaught fn

message適用于父子進(jìn)程之間發(fā)送消息,關(guān)于如何創(chuàng)建父子進(jìn)程會(huì)放在child_process模塊中進(jìn)行。

SIGTERM信號(hào)雖然也是用于請(qǐng)求終止Node.js進(jìn)程,但是它與SIGKILL有所不同,進(jìn)程可以選擇響應(yīng)還是忽略此信號(hào)。
SIGTERM會(huì)以一種友好的方式來結(jié)束進(jìn)程,在進(jìn)程結(jié)束之前先釋放已分配的資源(比如數(shù)據(jù)庫連接),因此這種方式被稱為優(yōu)雅關(guān)閉(graceful shutdown)
具體的執(zhí)行步驟如下:

應(yīng)用程序被通知需要關(guān)閉(接收到SIGTERM信號(hào))

應(yīng)用程序通知負(fù)載均衡不再接收新的請(qǐng)求

應(yīng)用程序完成正在進(jìn)行中的請(qǐng)求

釋放資源(例如數(shù)據(jù)庫連接)

應(yīng)用程序正常退出,退出狀態(tài)碼為0

SIGUSR1
Node.js當(dāng)接收到SIGUSR1信號(hào)時(shí)會(huì)啟動(dòng)內(nèi)置的調(diào)試器,當(dāng)執(zhí)行下列操作時(shí)

kill -USR1 PID_OF_THE_NODE_JS_PROCESS

可以看到node.js會(huì)啟動(dòng)調(diào)試器代理,端口是9229

server is listening 8089
Debugger listening on ws://127.0.0.1:9229/7ef98ccb-02fa-451a-8954-4706bd74105f
For help, see: https://nodejs.org/en/docs/inspector

也可以在服務(wù)啟動(dòng)時(shí)使用--inspect 來啟動(dòng)調(diào)試代理

node --inspect index.js
調(diào)度任務(wù)

process.nextTick(fn)

通過process.nextTick調(diào)度的任務(wù)是異步任務(wù),EventLoop是分階段的,每個(gè)階段執(zhí)行特定的任務(wù),而nextTick的任務(wù)在階段切換的時(shí)候就會(huì)執(zhí)行,因此nextTick會(huì)比setTimeout(fn, 0)更快的執(zhí)行,關(guān)于EventLoop見下圖,后面會(huì)做進(jìn)一步詳細(xì)的講解

發(fā)出警告
process.emitWarning("Something warning happened!", {
  code: "MY_WARNING",
  type: "XXXX"
});

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

當(dāng)type為DeprecationWarning時(shí),可以通過命令行選項(xiàng)施加影響

--throw-deprecation 會(huì)拋出異常

--no-deprecation 不輸出DeprecationWarning

--trace-deprecation 打印詳細(xì)堆棧信息

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107838.html

相關(guān)文章

  • Node.js child_process模塊解讀

    摘要:而且方式創(chuàng)建的子進(jìn)程與父進(jìn)程之間建立了通信管道,因此子進(jìn)程和父進(jìn)程之間可以通過的方式發(fā)送消息。與事件的回調(diào)函數(shù)有兩個(gè)參數(shù)和,代碼子進(jìn)程最終的退出碼,如果子進(jìn)程是由于接收到信號(hào)終止的話,會(huì)記錄子進(jìn)程接受的值。 在介紹child_process模塊之前,先來看一個(gè)下面的代碼。 const http = require(http); const longComputation = () =>...

    baiy 評(píng)論0 收藏0
  • 關(guān)于Node.js的__dirname,__filename,process.cwd(),./文件路

    摘要:先把當(dāng)成文件,依次查找當(dāng)前目錄下的,找到了,就返回該文件,不再繼續(xù)執(zhí)行。那么關(guān)于正確的結(jié)論是在中使用是跟的效果相同,不會(huì)因?yàn)閱?dòng)腳本的目錄不一樣而改變,在其他情況下跟效果相同,是相對(duì)于啟動(dòng)腳本所在目錄的路徑。 起因 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同進(jìn)步,以學(xué)習(xí)者的身份寫博...

    harryhappy 評(píng)論0 收藏0
  • 關(guān)于Node.js的__dirname,__filename,process.cwd(),./文件路

    摘要:先把當(dāng)成文件,依次查找當(dāng)前目錄下的,找到了,就返回該文件,不再繼續(xù)執(zhí)行。那么關(guān)于正確的結(jié)論是在中使用是跟的效果相同,不會(huì)因?yàn)閱?dòng)腳本的目錄不一樣而改變,在其他情況下跟效果相同,是相對(duì)于啟動(dòng)腳本所在目錄的路徑。 起因 原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動(dòng)態(tài),大家一起多交流學(xué)習(xí),共同進(jìn)步,以學(xué)習(xí)者的身份寫博...

    pumpkin9 評(píng)論0 收藏0
  • 如何打造一個(gè)令人愉悅的前端開發(fā)環(huán)境(四)

    摘要:在前后端分離的前端項(xiàng)目開發(fā)中經(jīng)常用到。是的一個(gè)中間件。即是一個(gè)重要的功能。配置先來在配置文件中引入添加一個(gè)和通信的客戶端添加應(yīng)用入口文件在插件中引入在我們的開發(fā)環(huán)境中是這樣配置的。 原文鏈接此文是我同事寫的,搭建Express結(jié)合Webpack。以下是正文,后面我會(huì)附上我的解讀 Express 結(jié)合 Webpack 實(shí)現(xiàn)HMR 本篇文件主要講結(jié)合 Webpack 和 Express 實(shí)...

    StonePanda 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<