Node.js規範化應用


Node.js執行在一個單執行緒模式,但它使用一個事件驅動範例來處理並行。它還有助於建立子進程,以充分利用併行處理的多核CPU系統。

子進程總是有三個流child.stdin,child.stdout和child.stderr這可能與父進程stdio流共用。

Node提供child_process模組,該模組具有以下三個主要的方法來建立子進程。

  • exec - child_process.exec方法在shell/控制台執行一個命令並緩衝輸出。

  • spawn - child_process.spawn啟動一個新的過程,一個給定的指令

  • fork - child_process.fork方法是指定spawn()來建立子進程的一個特例。

exec() 方法

child_process.exec方法在shell執行一個命令並緩衝輸出。它具有以下特徵:

child_process.exec(command[, options], callback)

引數

下面是使用的引數的說明:

  • command 字串是要執行的命令,用空格分隔的引數

  • options 物件可包括以下一個或多個選項:

    • cwd 子進程的字串當前工作目錄

    • env 物件環境的鍵值對

    • encoding 字串(預設:“UTF8”)

    • shell 字串執行(預設命令:在UNIX上為 '/bin/sh',在Windows為cmd.exe“, 在shell應該明白/s /c 在Windows或 -c 在UNIX/;在Windows中,命令列解析應與cmd.exe相容)

    • timeout 數位(預設: 0)

    • maxBuffer 數位(預設: 200*1024)

    • killSignal 字串 (預設: 'SIGTERM')

    • uid 數位用於設定過程的使用者的身份

    • gid 數位設定進程的組標識

  • callback 函式獲取三個引數錯誤,輸出和錯誤被稱為與下面的輸出,當進程終止。

在exec()方法返回一個緩衝帶最大尺寸,等待結束該進程,並嘗試一次返回所有快取資料。

例子

讓我們建立兩個JS檔案名分別為:support.js和master.js:

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess = child_process.exec('node support.js '+i,
      function (error, stdout, stderr) {
         if (error) {
            console.log(error.stack);
            console.log('Error code: '+error.code);
            console.log('Signal received: '+error.signal);
         }
         console.log('stdout: ' + stdout);
         console.log('stderr: ' + stderr);
      });

      workerProcess.on('exit', function (code) {
      console.log('Child process exited with exit code '+code);
   });
}

現在執行master.js看到結果:

$ node master.js

驗證輸出。伺服器已經啟動

Child process exited with exit code 0
stdout: Child Process 1 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.

spawn() 方法

child_process.spawn 方法啟動使用給定命令一個新的進程。它具有以下特徵:

child_process.spawn(command[, args][, options])

引數

下面是使用的引數的說明:

  • command 字串執行的命令

  • args 字串引數陣列列表

  • options 物件可包括以下一個或多個選項:

    • cwd 子進程的字串為當前工作目錄

    • env 物件環境的鍵值對

    • stdio 陣列|子串的標準輸入輸出組態

    • customFds 陣列,不推薦使用檔案描述符的子陣列,使用作為標准輸入輸出

    • detached 布林將是一個子行程群組

    • uid 數目設定進程的使用者的身份。

    • gid 數目設定進程的組標識。

spawn()方法返回流(標準輸出與標準錯誤),它當處理返回大量的資料被使用。spawn()開始接收到響應的進程開始執行。

例子

建立兩個JS檔案名分別為support.js和master.js:

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var workerProcess = child_process.spawn('node', ['support.js', i]);

   workerProcess.stdout.on('data', function (data) {
      console.log('stdout: ' + data);
   });

   workerProcess.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
   });

   workerProcess.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

現在執行master.js看到的結果:

$ node master.js

驗證輸出。伺服器已經啟動

stdout: Child Process 0 executed.

child process exited with code 0
stdout: Child Process 1 executed.

stdout: Child Process 2 executed.

child process exited with code 0
child process exited with code 0

fork方法

child_process.fork方法是spawn()來建立節點的過程的一個特例。它具有以下簽名

child_process.fork(modulePath[, args][, options])

引數

下面是使用的引數的說明:

  • modulePath 字串 - 該模組在執行子進程

  • args 字串 - 引數陣列列表

  • options 物件可包括以下一個或多個選項:

    • cwd 字串 - 子進程的當前工作目錄

    • env 物件環境的鍵值對

    • execPath 字串 - 可執行用於建立子進程

    • execArgv 傳遞給可執行字串引數陣列列表(預設值:process.execArgv)

    • silent Boolean - 如果為true,標準輸入,stdout和子標準錯誤將通過管道輸送到父進程,否則會從父繼承,看到“pipe”和“inherit”選項spawn()更多細節標準輸入輸出(預設為false)

    • uid 數位 - 設定進程的使用者的身份。

    • gid 數位 - 設定進程的組標識。

fork 方法返回與物件內建除了具有在正常ChildProcess範例的所有方法的通訊通道。

例子

建立兩個JS檔案名為support.js和master.js:

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var worker_process = child_process.fork("support.js", [i]);	

   worker_process.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

現在執行master.js看到的結果:

$ node master.js

驗證輸出。伺服器已經啟動

Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0