Node.js學習之路14——Process進程

Process

在Node.js中,只支持單線程。可是在應用程序中,若是隻使用單線程進行操做,從接收請求開始到返回響應爲止的這段時間內可能存在很長的一段等待時間。在這種場合下,若是可以使用多進程,則能夠爲每一個請求分配一個進程,從而能夠更好地使用服務器端的CPU資源。爲了實現多線程處理,Node.js中提供了 child_process模塊與 cluster模塊,其中的 child_process模塊用於實如今Node.js應用程序中開啓多個子進程,並在各個子進程中運行各類不一樣的命令或執行Node.js模塊文件,可執行文件的處理, cluster模塊用於實如今Node.js應用程序中開啓多個子進程,在每一個子進程中運行一個Node.js應用程序副本的處理。

1. 進程

1.1 進程對象的屬性

  • process.execPath: 用於運行應用程序的可執行文件的絕對路徑
  • version: Node.js的版本號
  • versions: Node.js及其各依賴的版本號
  • platform: 當前運行Node.js的平臺
  • stdin: 用於讀入標準輸入流的對象。默認狀況下,標準輸入流處於暫停狀態,好比恢復讀取標準輸入流process.stdin.resume()
  • stdout: 用於寫入標準輸出流的對象
  • stderr: 用於寫入標準錯誤輸出流的對象javascript

    • 與其餘寫入流數據的對象不一樣,process.stdout對象與process.stderr對象的寫數據操做是一種阻塞型操做
    • 只有當使用其餘讀取流數據的對象的pipe方法,而且將process.stdout對象或process.stderr對象做爲目標對象的時候,process.stdout對象與process.stderr對象的寫數據操做纔是非阻塞型操做。
  • argv: 屬性值爲一個數組,包含了運行Node.js應用程序時全部命令行參數。
  • env: 運行Node.js應用程序的操做系統的信息
  • config: 包含了用於編譯當前Node.js應用程序的可執行文件的配置選項的JavaScript描述
  • pid: 運行當前Node.js應用程序的進程PID
  • title: 運行當前Node.js應用程序命令行窗口的標題
  • arch: 運行當前Node.js應用程序的處理器架構,arm,ia32,x64等

1.2 進程對象的方法

1.2.1 內存使用量memoryUsage()

  • 該方法不使用任何參數,返回一個對象,對象所擁有的屬性以下
  • rss: 屬性值爲一個整數,表示運行Node.js應用程序的進程的內存消耗量,單位爲字節
  • headTotal: 屬性值爲一個整數,表示爲V8所分配的內存量,單位爲字節
  • headUsed: 屬性值爲一個整數,表示V8的內存消耗量,單位爲字節

1.2.2 nextTick()方法

  • process.nextTick(callback)參數爲被推遲的函數
  • 用於將一個函數推遲到代碼中所書寫的下一個同步方法執行完畢時,或異步方法的事件回調函數開始執行時調用。
  • 做用與將setTimeout方法的事件參數值指定爲0的做用相同
  • 可是nextTick()方法中指定的函數的調用速度比setTimeout方法中指定的函數的調用速度快不少
  • 在讀取完畢文件後調用nextTick()
const process = require('process');
const fs = require('fs');
var finish = function () {
    console.log('文件讀取完畢');
}
process.nextTick(finish);
console.log(fs.readFileSync('./fs.js').toString());
  • 指定兩個耗時操做同步進行
const process = require('process');
const fs = require('fs');
function foo() {
    process.nextTick(Task);
}
function Task() {
    var file = fs.createReadStream('./fs.js');
    file.on('data', (data) => {
        console.log('Task函數中,讀取到字節長度:', data.length);
    })
}
var file = fs.createReadStream('./fs.js');
file.on('data', (data) => {
    console.log('全局中,讀取到字節長度:', data.length);
});
foo();
  • 在Node.js中,提供了一個process.maxTickDepth屬性,默認的屬性值爲1000,當遞歸深度達到process.maxTickDepth屬性值以後,容許遞歸函數以外的代碼繼續執行,可是會發出警告,提醒開發者改用setImmediate方法

1.2.3 process.abort()方法

  • 向運行Node.js應用程序的進程發出SIGABRT信號,使進程異常終止,同時產生一個核心文件,該方法中不使用任何參數

1.2.4 改變文件目錄process.chdir()

  • 修改Node.js應用程序中使用的當前工做目錄
  • process.chdir(directory)
  • 參數能夠爲一個字符串,用於指定當前工做目錄,該目錄能夠爲一個相對路徑,也能夠爲一個絕對路徑。若是指定路徑不存在,報錯。

1.2.5 返回當前目錄process.cwd()

const process = require('process');
console.log('當前目錄:' + process.cwd());
process.chdir('../');
console.log('上層目錄:' + process.cwd());

1.2.6 退出程序process.exit()

  • 退出運行Node.js應用程序的進程
  • 使用一個整數值參數,指定爲操做系統提供退出代碼,代碼爲0表示正常退出,不使用該參數時的默認參數值爲0

1.2.7 設置或返回進程的組ID

  • process.getgid() 返回運行Node.js應用程序的進程的組ID,該方法只有在非windows操做系統下有效,不使用任何參數
  • process.setgid(id) 用於設置運行Node.js應用程序的進程的組ID,該方法只有在非windows操做系統下有效,不使用任何參數
  • setgid方法中使用一個參數,參數值能夠爲一個整數類型的組ID,也能夠爲一個字符串類型的組名,若是指定組名,該組名將自動解析爲組ID

1.2.8 設置或返回進程的用戶ID

  • process.getuid() 返回運行Node.js應用程序的進程的用戶ID,該方法只有在非windows操做系統下有效,不使用任何參數
  • process.setuid(id) 用於設置運行Node.js應用程序的進程的用戶ID,該方法只有在非windows操做系統下有效

1.2.9 向進程發送信號

  • process.kill(pid, [signal])用於向進程發送信號
  • pid參數爲必須指定參數,signal參數爲可選參數,pid參數爲一個整數,用於指定須要接收信號的進程IDsignal參數值爲一個字符串,用於指定須要發送的信號,例如SIGINTSIGUSR1,當不使用該參數時,默認參數值爲SIGTERM,表示終止該進程

1.2.9 讀取或修改進程的文件權限掩碼

  • umask([mask])用於讀取或修改運行Node.js應用程序的進程的文件權限掩碼。
  • 子進程將繼承父進程的文件權限掩碼
  • 參數用於設定修改後的文件權限掩碼,若是不使用參數,返回進程當前使用的文件的權限掩碼
const process = require('process');
var oldmask, newmask = 0644;
oldmask = process.umask(newmask);
console.log('修改前的掩碼:', oldmask.toString(8));
console.log('修改後的掩碼:', newmask.toString(8));
/****
 * 修改前的掩碼: 0
 * 修改後的掩碼: 644
 */

1.2.10 時間

  • 返回當前運行時間(秒)process.uptime()
  • 測試一個代碼運行時間process.hrtime()
const process = require('process');
let time = process.hrtime();
for (let i = 0; i < 1000; i++) { }
var endTime = process.hrtime(time);
console.log(endTime);

1.3 進程對象的事件

1.3.1 退出事件exit

const process = require('process');
process.on('exit', () => {
    console.log('Node.js程序退出');
});
process.exit();

1.3.2 異常事件uncaughtException

const process = require('process');
process.on('uncaughtException', (err) => {
    console.log('捕獲到一個異常錯誤', err);
});
undefinedFunction();

1.3.3 各類信號事件

  • 當運行Node.js應用程序的進程接收到各類事件是,會觸發各類信號事件
  • 能夠經過對這些事件進行監聽並指定事件回調函數的方法對該信號進行處理,回調函數不須要任何參數。

1.4 建立多進程應用程序

1.4.1 使用spawn方法開啓子進程

  • child_process.spawn(command, [args], [options])
  • command參數值爲一個字符串,指定須要運行的命令
  • args爲一個數組,存放了全部運行該命令時所須要使用的參數,參數的指定順序與數組中的元素順序保持一致,默認爲空
  • option參數值爲一個對象,用於指定開啓子進程時所使用的選項java

    • cwd: 指定子進程當前的工做目錄
    • stdio: 設置子進程的標準輸入/輸出
    • customFds: 數組,子進程的標準輸入/輸出指定文件描述符
    • env: 爲子進程指定環境變量,不指定時,沒有可使用的環境變量
    • detached: 布爾值,該子進程爲一個進程組中的領頭進程
    • uid: 設置子進程的用戶ID
    • gid: 設置子進程的組ID
const process = require('process');
const cp = require('child_process');
let sp1 = cp.spawn('node', ['test1.js', 'one', 'two', 'three'], {cwd: './one'})
let sp2 = cp.spawn('node', ['test2.js'], {stdio: 'pipe'});
sp1.stdout.on('data', (data)=>{
    console.log('子進程 sp1 標註輸出:', data);
    sp2.stdin.write(data);
});

sp1.on('exit', (code, signal)=>{
    console.log('子進程 sp1 退出,退出代碼爲', code);
    process.exit();
});
相關文章
相關標籤/搜索