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