首頁 >web前端 >js教程 >使用node.js如何建立子進程(詳細教學)

使用node.js如何建立子進程(詳細教學)

亚连
亚连原創
2018-06-21 17:33:512793瀏覽

之前看多進程這一章節時發現這塊東西挺多,寫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實例所具有的所有方法,所傳回的物件還具有內建的通訊通道。

上面是我整理給大家的,希望今後對大家有幫助。

相關文章:

在vue-cli中如何實作元件通訊

使用angular完成Message元件編寫

使用EasyUI如何綁定Json資料來源

#

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

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