鍍金池/ 教程/ HTML/ Node.js規(guī)范化應(yīng)用
Node.js快速入門
Node.js事件發(fā)射器
Node.js包(JXcore)
Node.js事件循環(huán)
Node.js文件系統(tǒng)
Node.js npm
Node.js安裝和入門
Node.js工具模塊
Node.js回調(diào)概念
Node.js流
Node.js入門實(shí)例程序
Node.js教程
Node.js規(guī)范化應(yīng)用
Node.js REPL終端
Node.js緩沖器
Node.js RESTful API
Node.js全局對(duì)象
Linux安裝Node.js(源碼編譯安裝)
Node.js Web模塊
Node.js Express框架

Node.js規(guī)范化應(yīng)用

Node.js運(yùn)行在一個(gè)單線程模式,但它使用一個(gè)事件驅(qū)動(dòng)范例來(lái)處理并發(fā)。它還有助于創(chuàng)建子進(jìn)程,以充分利用并行處理的多核CPU系統(tǒng)。

子進(jìn)程總是有三個(gè)流child.stdin,child.stdout和child.stderr這可能與父進(jìn)程stdio流共享。

Node提供child_process模塊,該模塊具有以下三個(gè)主要的方法來(lái)創(chuàng)建子進(jìn)程。

  • exec - child_process.exec方法在shell/控制臺(tái)運(yùn)行一個(gè)命令并緩沖輸出。

  • spawn - child_process.spawn啟動(dòng)一個(gè)新的過(guò)程,一個(gè)給定的指令

  • fork - child_process.fork方法是指定spawn()來(lái)創(chuàng)建子進(jìn)程的一個(gè)特例。

exec() 方法

child_process.exec方法在shell運(yùn)行一個(gè)命令并緩沖輸出。它具有以下特征:

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

參數(shù)

下面是使用的參數(shù)的說(shuō)明:

  • command 字符串是要運(yùn)行的命令,用空格分隔的參數(shù)

  • options 對(duì)象可包括以下一個(gè)或多個(gè)選項(xiàng):

    • cwd 子進(jìn)程的字符串當(dāng)前工作目錄

    • env 對(duì)象環(huán)境的鍵值對(duì)

    • encoding 字符串(缺?。?ldquo;UTF8”)

    • shell 字符串執(zhí)行(默認(rèn)命令:在UNIX上為 '/bin/sh',在Windows為cmd.exe“, 在shell應(yīng)該明白/s /c 在Windows或 -c 在UNIX/;在Windows中,命令行解析應(yīng)與cmd.exe兼容)

    • timeout 數(shù)字(默認(rèn): 0)

    • maxBuffer 數(shù)字(默認(rèn): 200*1024)

    • killSignal 字符串 (默認(rèn): 'SIGTERM')

    • uid 數(shù)字用于設(shè)置過(guò)程的用戶的身份

    • gid 數(shù)字設(shè)置進(jìn)程的組標(biāo)識(shí)

  • callback 函數(shù)獲取三個(gè)參數(shù)錯(cuò)誤,輸出和錯(cuò)誤被稱為與下面的輸出,當(dāng)進(jìn)程終止。

在exec()方法返回一個(gè)緩沖帶最大尺寸,等待結(jié)束該進(jìn)程,并嘗試一次返回所有緩存數(shù)據(jù)。

例子

讓我們創(chuàng)建兩個(gè)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);
   });
}

現(xiàn)在運(yùn)行master.js看到結(jié)果:

$ node master.js

驗(yàn)證輸出。服務(wù)器已經(jīng)啟動(dòng)

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 方法啟動(dòng)使用給定命令一個(gè)新的進(jìn)程。它具有以下特征:

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

參數(shù)

下面是使用的參數(shù)的說(shuō)明:

  • command 字符串運(yùn)行的命令

  • args 字符串參數(shù)數(shù)組列表

  • options 對(duì)象可包括以下一個(gè)或多個(gè)選項(xiàng):

    • cwd 子進(jìn)程的字符串為當(dāng)前工作目錄

    • env 對(duì)象環(huán)境的鍵值對(duì)

    • stdio 數(shù)組|子串的標(biāo)準(zhǔn)輸入輸出配置

    • customFds 數(shù)組,不推薦使用文件描述符的子數(shù)組,使用作為標(biāo)準(zhǔn)輸入輸出

    • detached 布爾將是一個(gè)子進(jìn)程組

    • uid 數(shù)目設(shè)置進(jìn)程的用戶的身份。

    • gid 數(shù)目設(shè)置進(jìn)程的組標(biāo)識(shí)。

spawn()方法返回流(標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤),它當(dāng)處理返回大量的數(shù)據(jù)被使用。spawn()開(kāi)始接收到響應(yīng)的進(jìn)程開(kāi)始執(zhí)行。

例子

創(chuàng)建兩個(gè)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);
   });
}

現(xiàn)在運(yùn)行master.js看到的結(jié)果:

$ node master.js

驗(yàn)證輸出。服務(wù)器已經(jīng)啟動(dòng)

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()來(lái)創(chuàng)建節(jié)點(diǎn)的過(guò)程的一個(gè)特例。它具有以下簽名

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

參數(shù)

下面是使用的參數(shù)的說(shuō)明:

  • modulePath 字符串 - 該模塊在運(yùn)行子進(jìn)程

  • args 字符串 - 參數(shù)數(shù)組列表

  • options 對(duì)象可包括以下一個(gè)或多個(gè)選項(xiàng):

    • cwd 字符串 - 子進(jìn)程的當(dāng)前工作目錄

    • env 對(duì)象環(huán)境的鍵值對(duì)

    • execPath 字符串 - 可執(zhí)行用于創(chuàng)建子進(jìn)程

    • execArgv 傳遞給可執(zhí)行字符串參數(shù)數(shù)組列表(默認(rèn)值:process.execArgv)

    • silent Boolean - 如果為true,標(biāo)準(zhǔn)輸入,stdout和子標(biāo)準(zhǔn)錯(cuò)誤將通過(guò)管道輸送到父進(jìn)程,否則會(huì)從父繼承,看到“pipe”和“inherit”選項(xiàng)spawn()更多細(xì)節(jié)標(biāo)準(zhǔn)輸入輸出(默認(rèn)為false)

    • uid 數(shù)字 - 設(shè)置進(jìn)程的用戶的身份。

    • gid 數(shù)字 - 設(shè)置進(jìn)程的組標(biāo)識(shí)。

fork 方法返回與對(duì)象內(nèi)置除了具有在正常ChildProcess實(shí)例的所有方法的通信信道。

例子

創(chuàng)建兩個(gè)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);
   });
}

現(xiàn)在運(yùn)行master.js看到的結(jié)果:

$ node master.js

驗(yàn)證輸出。服務(wù)器已經(jīng)啟動(dòng)

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

上一篇:Node.js流下一篇:Node.js快速入門