首頁  >  文章  >  web前端  >  教大家如何利用node.js創建子進程

教大家如何利用node.js創建子進程

小云云
小云云原創
2017-12-11 09:35:581631瀏覽

多進程相關知識挺多,寫Process模組的時候也有提到,但是,發現也不是太難理解。本文主要為大家介紹了利用node.js如何創建子進程的相關資料,需要的朋友可以參考下,希望能幫助大家。

前言

node本身為單一進程,並使用驅動模式處理並發,為了解決單一進程在多核心cpu上的資源浪費, node提供了cluster和child_process模組來建立多個子進程。

Node.js是單執行緒的,對於現在普遍是多處理器的機器是一種浪費,怎麼能利用起來呢?於是child_process模組出現了。 child_process模組可以在其他行程上產生、衍生,並執行工作。

child_process模組提供了一個ChildProcess的新類,它可以作為從父行程存取子程序的表示。 Process模組也是ChildProcess物件。當你從父模組存取process時,它是父ChildProcess對象,當你從子程序存取Process是,它是ChildProcess物件

了解一個物件無外乎事件、方法、屬性。 ChildProcess也是一樣。

每個子程序總是有三個流物件:child.stdin、child.stdout、child.stderr。他們可能會共享父進程的stdio流。

這裡我們先介紹利用child_process模組中exec、spawn、fork三個方法對子程序的操作。

建立node-childProcess文件,在其中建立node-childPro.js檔案。

其中就一行程式碼如下:


console.log("进程 " + process.argv[2] + " 执行。" );
//换成下面的查看process.argv
//console.log("进程 " + process.argv + " 执行。" );


exec()方法

在node-childProcess檔案中新建node-childPro-exec.js文件,其中程式碼如下:


##

const fs = require('fs');
const child_process = require('child_process');
for (var i = 0; i < 3; i++) {
 //这里有空格请注意。分别代表node路径 node-childPro.js路径 i第几个进程。 node-childPro.js中的process.argv可以获取这些信息值
 var childProcess = child_process.exec(&#39;node node-childPro.js &#39;+i,
 // 回调函数 子进程的输出以回调函数参数的形式返回
 function (error, stdout, stderr) {
  if (error) {
  console.log(error.stack);
  console.log(&#39;Error code: &#39; + error.code);
  console.log(&#39;Signal received: &#39; + error.signal);
  }
  console.log(&#39;stdout: &#39; + stdout);
  console.log(&#39;stderr: &#39; + stderr);
 });
 childProcess.on(&#39;exit&#39;, function (code) {
 console.log(&#39;子进程已退出,退出码 &#39; + code);
 });
}




終端執行程式碼結果如下:

##
G:\node\node-childProcess> node node-childPro-exec.js
子进程已退出,退出码 0
stdout: 进程 0 执行。
stderr:
子进程已退出,退出码 0
stdout: 进程 1 执行。
stderr:
子进程已退出,退出码 0
stdout: 进程 2 执行。
stderr:



#spawn()方法


在node-childProcess檔案中新建node-childPro-spawn.js,其中程式碼如下:


const fs = require(&#39;fs&#39;);
const child_process = require(&#39;child_process&#39;);
 for(var i=0; i<3; i++) {
 var childProcess = child_process.spawn(&#39;node&#39;, [&#39;node-childPro-spawn.js&#39;, i]);  
 childProcess.stdout.on(&#39;data&#39;, function (data) {
 console.log(&#39;stdout: &#39; + data);
 });
childProcess.stderr.on(&#39;data&#39;, function (data) {
 console.log(&#39;stderr: &#39; + data);
 });
 childProcess.on(&#39;close&#39;, function (code) {
 console.log(&#39;子进程已退出,退出码 &#39;+code);
 });
}

#終端執行程式碼結果如下:

G:\node\node-childProcess> node node-childPro-spawn.js
stdout: 进程 0 执行。
子进程已退出,退出码 0
stdout: 进程 1 执行。
stdout: 进程 2 执行。
子进程已退出,退出码 0
子进程已退出,退出码 0



#fork()方法


在node-childProcess檔案中新node-childPro-fork.js,其中程式碼如下:


##

const fs = require(&#39;fs&#39;);
const child_process = require(&#39;child_process&#39;);
 for(var i=0; i<3; i++) {
 var childProcess = child_process.fork("node-childPro.js", [i]); 
 childProcess.on(&#39;close&#39;, function (code) {
 console.log(&#39;子进程已退出,退出码 &#39; + code);
 });
}





#終端機執行程式碼結果如下:

G:\node\node-childProcess> node node-childPro-fork.js
进程 0 执行。
进程 1 执行。
子进程已退出,退出码 0
进程 2 执行。
子进程已退出,退出码 0
子进程已退出,退出码 0

#關於exec、spawn、fork

##     1.exec函數是對spawn的一種友善封裝,增加Shell指令解析,可以直接嵌入複雜的指令

     2.exec函數快取子程序的輸出,並將子進程的輸出以回呼函數參數的形式傳回

     3.spawn在子執行緒開始執行後,就開始不斷將資料從子進程回傳給主進程(應用場景如「系統監控”)#########     4.spawn是不支援callback函數的,它透過流的方式發資料傳給主進程,從而實現了多進程之間的資料交換####### ##     5.fork()是spawn()的特殊情景,用於衍生Node流程。除了普通ChildProcess實例所具有的所有方法,所傳回的物件還具有內建的通訊通道。 ######大家學會了嗎?趕快動手嘗試。 ######相關推薦:#########PHP與Node.js#############Node.js之關於非同步流控制的簡單介紹#### ########Node.JS的相關知識######

以上是教大家如何利用node.js創建子進程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn