node ( 5 ) -----process詳解(這個標題不討喜……)

進程

process 對象是一個全局變量,它提供當前 Node.js 進程的有關信息,以及控制當前 Node.js 進程。 由於是全局變量,因此無需使用 require()。在Node.js中每一個應用程序都是一個進程類的實例對象。javascript

進程對象屬性

  • execPath 可執行文件的絕對路徑,如 /usr/local/bin/node
  • version 版本號
  • versions依賴庫的版本號
  • platform 運行平臺。 如 darwin、freebsd、linux、sunos、win32
  • stdin 標準輸入流可讀流,默認暫停狀態
  • stdout 標準輸出可寫流,同步操做
  • argv 屬性值爲數組
  • env 操做系統環境信息
  • title 窗口標題
  • arch 處理器架構 arm ia32 x64
process.stdin.resume();
process.stdin.on('data',function(chunk){
  process.stdout.write(`進程接收到數據: `+chunk);
});
複製代碼
process.argv.forEach((val,index,ary)=> console.log(index,val));

複製代碼

方法

1.memoryUsage 內存佔用狀況java

process.memoryUsage()
複製代碼
  • rss(resident set size):全部內存佔用,包括指令區和堆棧。
  • heapTotal:"堆"佔用的內存,包括用到的和沒用到的。
  • heapUsed:用到的堆的部分。
  • external: V8 引擎內部的 C++ 對象佔用的內存。

2.nextTick nextTick方法用於將一個函數推遲到代碼中所書寫的下一個同步方法執行完畢或異步方法的回調函數開始執行前調用 3. chdir chdir方法用於修改Node.js應用程序中使用的當前工做目錄,使用方式以下node

process.chdir(directory);
複製代碼

4.cwd cwd方法用返回當前目錄,不使用任何參數linux

console.log(process.cwd());
複製代碼

5.chdir 改變當前的工做目錄shell

console.log(`當前目錄: ${process.cwd()}`);
process.chdir('..); console.log(`上層目錄: ${process.cwd()}); 複製代碼

6.exit 退出運行Node.js應用程序的進程數組

process.exit(0);
複製代碼

7.killbash

  • SIGINT 程序終止(interrupt)信號, 在用戶鍵入INTR字符(一般是Ctrl-C)時發出,用於通知前臺進程組終止進程。
  • SIGTERM 程序結束(terminate)信號, 該信號能夠被阻塞和處理。一般用來要求程序本身正常退出,shell命令kill缺省產生這個信號
  • pid是一個整數,用於指定須要接收信號的進程ID
  • signal 發送的信號,默認爲 SIGTERM
process.kill(pid,[signal]);
複製代碼

8.uptime 返回當前程序的運行時間架構

process.uptime()

複製代碼

9.hrtime 測試一個代碼段的運行時間,返回兩個時間,第一個單位是秒,第二個單位是納秒異步

let fs = require('fs); let time = process.hrtime(); let data = fs.readFileSync('index.txt'); let diff = process.hrtime(time); console.log(`讀文件操做耗費的%d秒`,diff[0]); 複製代碼

10.exitide

當運行Node.js應用程序進程退出時觸發進程對象的exit事件。能夠經過指定事件回調函數來指定進程退出時所執行的處理。(先退出,後關閉)

process.on('exit',function(){
    console.log('Node.js進程被推出); }); process.exit(); 複製代碼

11.uncaughtException 當應用程序拋出一個未被捕獲的異常時觸發進程對象的uncaughtException事件

process.on('uncaughtException',function(err){
  console.log('捕獲到一個未被處理的錯誤:',err);
});
複製代碼

12.信號事件

process.stdin.resume();
process.on('SIGINT',function(){
    console.log('接收到SIGINT信號');
});
複製代碼

子進程

  • 在Node.js中,只有一個線程執行全部操做,若是某個操做須要大量消耗CPU資源的狀況下,後續操做都須要等待。
  • 在Node.js中,提供了一個child_process模塊,經過它能夠開啓多個子進程,在多個子進程之間能夠共享內存空間,能夠經過子進程的互相通訊來實現信息的交換。

spawn

child_process.spawn(command,[args],[options]);
複製代碼
  • command 必須指定的參數,指定須要執行的命令
  • args 數組,存放了全部運行該命令須要的參數
  • options 參數爲一個對象,用於指定開啓子進程時使用的選項
    • cwd 子進程的工做目錄
    • env 環境變量
    • detached 若是爲true,該子進程魏一個進程組中的領頭進程,當父進程不存在時也能夠獨立存在
    • stdio 三個元素的數組,設置標準輸入/輸出
      • pipe 在父進程和子進程之間建立一個管道,父進程能夠經過子進程的stdio[0]訪問子進程的標準輸入,經過stdio[1]訪問標準輸出,stdio[2]訪問錯誤輸出
      • ipc 在父進程和子進程之間建立一個專用與傳遞消息的IPC通道。能夠調用子進程的send方法向子進程發消息,子進程會觸發message事件
      • ignore 指定不爲子進程設置文件描述符。這樣子進程的標準輸入、標準輸出和錯誤輸出被忽略
      • stream 子進程和父進程共享一個終端設備、文件、端口或管道
      • 正整數值 和共享一個steam是同樣的
      • null或undefined 在子進程中建立與父進程相連的管道
      • argv 表明的是子進程的參數,是個數組且第一,二項是固定的,(執行環境,執行文件) 默認狀況下,子進程的stdin,stdout,stderr導向了ChildProcess這個對象的child.stdin,child.stdout,child.stderr流, 案例: spawn
let {spawn} = require('child_process');
let path = require('path');
// process.cwd()
let child = spawn('node',['1.test.js','a','b','c'],{
    cwd:path.join(__dirname,'pro')
    
});

//若是不寫stdio 默認是管道類型
child.stdout.on('data',function(data){
    console.log(data.toString());
});
複製代碼

1.test.js

process.argv.slice(2).forEach(function(arg){
    process.stdout.write(arg);
})  
複製代碼

node 執行spawn文件,結果以下

a
bc
exit
close
複製代碼

detached

  • 在默認狀況下,只有在子進程所有退出後,父進程才能退出。爲了讓父進程能夠先退出,而讓子進程繼續進行I/O操做,能夠在spawn方法中使用options參數,把detached屬性值設置爲true
  • 默認狀況下父進程會等待全部的子進程退出後才能夠退出,使用subprocess.unref方法可讓父進程不用等待子進程退出就能夠直接退出 detached.js
// detach 將主進程關掉,子進程能夠本身運行

// unref()

let {spawn} = require('child_process');
let path  = require('path');
let fd = require('fs').openSync('./100.txt','w')
let child = spawn('node',['detach.js'],{
    cwd:path.join(__dirname,'pro'),
    stdio:['ignore',fd,'ignore'],
    detached:true
});
child.unref();
複製代碼

detached.test.js

// 會自動將這個描述符包裝成可寫流
setInterval(function(){
    process.stdout.write('hello');
},1000);//最後只能在任務管理器中關了進程
複製代碼

ipc 用send和onmessage通訊 ipc

let {spawn} = require('child_process');
let path = require('path');
let child = spawn('node',['3.ipc.js'],{
    cwd:path.join(__dirname,'pro'),
    stdio:['pipe','pipe','pipe','ipc']
})
// ignore 不要子進程的數據
// pipe 管道創建管道
// null
child.send({name:'李雷'});

child.on('message',function(data){
    console.log(data);//不會自動關閉,會一直跑着
    child.kill(); // 殺死進程
});
複製代碼

ipc.test.js

process.on('message',function(msg){
    process.send(msg.name+'很帥')
})
複製代碼

fork

  • 衍生一個新的 Node.js 進程,並經過創建一個 IPC 通信通道來調用一個指定的模塊,該通道容許父進程與子進程之間相互發送信息
  • fork方法返回一個隱式建立的表明子進程的ChildProcess對象
  • 子進程的輸入/輸出操做執行完畢後,子進程不會自動退出,必須使用process.exit()方法顯式退出
child_process.fork(modulePath,[args],[options]);
複製代碼
  • args 運行該文件模塊文件時許喲啊使用的參數
  • options 選項對象
    • cwd 指定子進程當前的工做目錄
    • env 屬性值爲一個對象,用於以"鍵名/鍵值"的形式爲子進程指定環境變量
    • encoding 屬性值爲一個字符串,用於指定輸出及標準錯誤輸出數據的編碼格式,默認值爲'utf8'
    • silent 屬性值爲布爾值,當屬性值爲false時,子進程和父進程對象共享標準(輸入/輸出),true時不共享

fork.js

let { spawn } = require('child_process');
let path = require('path');

let child = fork('fork.js', ['a', 'b', 'c'], {
    cwd: path.join(__dirname, 'pro'),
    silent: false // 這句話的意思就是 ['ignore','ignore','ignore','ipc']安靜
});
// 默認支持ipc的方式
// 默認的fork [0,1,2,'ipc']
child.send('hello');
複製代碼

其實fork的實現很簡單

function fork(modulePath, args, options = {}) {
    if (options.silent) {
        options.stdio = ['ignore', 'ignore', 'ignore', 'ipc']
    } else {
        options.stdio = [0, 1, 2, 'ipc']
    }
    return spawn('node', [modulePath, ...args],options)
}
複製代碼

看看誰點讚了

相關文章
相關標籤/搜索