NodeJs之child_process

来源:http://www.cnblogs.com/zqzjs/archive/2016/11/19/6080531.html
-Advertisement-
Play Games

一:child_process child_process是NodeJs的重要模塊。幫助我們創建多進程任務,更好的利用了電腦的多核性能。 當然也支持線程間的通信。 二:child_process的幾個API 非同步: child_process.exec(command[, options][, c ...


 

一:child_process


child_process是NodeJs的重要模塊。幫助我們創建多進程任務,更好的利用了電腦的多核性能。

當然也支持線程間的通信。

 

二:child_process的幾個API


非同步:

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

child_process.execFile(file[, args][, options][, callback])

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

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

同步:

child_process.execFileSync(file[, args][, options])

child_process.execSync(command[, options])

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

事件:

Event: 'close'

Event: 'disconnect'

Event: 'error'

Event: 'exit'

Event: 'message'

 

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


command:只執行的命令

args:參數列表

options:環境變數

先用一下:查詢磁碟大小

var child_process = require('child_process');
var spawn = child_process.spawn;

var wmic = spawn('wmic', ['DiskDrive', 'get', 'Size', '/value']);

wmic.stdout.on('data', function(data) {
     console.log('使用spawn方法輸出: ' + data);
 });

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

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

上面的命令在cmd中:wmic DiskDrive get Size /value

Node 通過 child_process 模塊提供了類似 popen(3) 的處理三向數據流(stdin/stdout/stderr)的功能。

 

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


exec添加了對shell命令的解析,可以執行複雜的命令。不需要像spawn一樣分開寫參數。並且有一個回調。

直接使用:wmic DiskDrive get Size /value

var child_process = require('child_process');
var exec = child_process.exec;

exec('wmic DiskDrive get Size /value', function (error, stdout, stderr) {
   if (error) {
     console.log(error.stack);
     console.log('Error code: '+error.code);
     return;
   }
   console.log('使用exec方法輸出: '+stdout);
   console.log(`stderr: ${stderr}`);
});

如果沒出錯,error參數為null,退出碼為0.只要不為0,就出錯。

 

五:child_process.execFile(file[, args][, options][, callback])


不執行shell.

使用:

var execFile = require('child_process').execFile;
var child = execFile('node', ['--version'], (error, stdout, stderr) => {
  if (error) {
    throw error;
  }
  console.log(stdout);
});

 

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


不同於spawn,fork函數會在進程間建立通訊通道。

使用:父子進程的通信。這個經常使用!

parent.js

//主進程
var childProcess = require('child_process');
var child = childProcess.fork('./child.js');

//接受來自子進程的消息
n.on('message', function(msg) {
  console.log('來自子進程的消息: ', msg);
});

//發送消息給子(fork)進程
n.send({ hello: 'zqz' });

 

child.js

//子進程
//接受來自父進程的消息
process.on('message', function(msg) {
  console.log('收到父進程的消息:', msg);
});

//向父進程發送消息
process.send({ Hello: 'Mr.zhao' });

 

七:close 事件


“關閉”事件在會在所有stdio流子進程關閉時候觸發。這是有別於“退出”的事件,因為多個進程可以共用相同的stdio流。

 

八:disconnect 事件


在子進程或父進程中使用使用.disconnect()方法後,這個事件會被觸發,在斷開之後,就不可能再相互發送信息了。

可以通過檢查子進程的child.connected屬性是否為true去檢查是否可以發送信息。

 

九:error 事件


觸發的條件:

1.進程不能被創建, 或者

2.進程不能被終止掉, 或者

3.由任何原因引起的數據發送到子進程失敗.

 

十:exit 事件


這個事件是在子進程被結束的時候觸發的. 假如進程被正常結束,‘code’就是退出進程的指令代碼, 否則為'null'. 假如進程是由於接受到signal結束的, signal 就代表著信號的名稱, 否則為null.

 

十一:message 事件


通過.send()發送的信息可以通過監聽'message'事件獲取到。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 軟體工程的構件化道路發展到今天,已經具有成熟的技術。這就像今天的大廈建築一樣,使用預製的構件,就能建造萬丈高樓。同樣道理,使用Spring Boot開發框架,也可以支持這種構件化的功能,正像其官方網站所介紹的那樣,你甚至可以不用寫一行代碼,就可運行一個應用:“Spring Boot makes it ...
  • (一) 下邊使用outputStream位元組輸出流進行寫操作 package zdbIO;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.I ...
  • 6 類型推測 java編譯器能夠檢查所有的方法調用和對應的聲明來決定類型的實參,即類型推測,類型的推測演算法推測滿足所有參數的最具體類型,如下例所示: 6.1 泛型方法的類型推測 類型的推測可以使泛型方法的使用語法和普通的方法一樣,不必指定尖括弧內的類型,如上述例子。 6.2 泛型類的類型推測 對於泛 ...
  • 複習一下: 1.先創建一個properties配置文件 2.載入讀取配置文件 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.s ...
  • 一切偉大的行動和思想,都有一個微不足道的開始! ...
  • 1、列偏移與列排序: ①列偏移:控制列出現的位置,某列偏移後,後序列會隨之偏移——只能右偏移; col-lg/md/sm/xs-offset-*; ②列排序:控制某一列的位置,該列可以左(pull)右(push)調整,其排序後,其它列不受影響; col-lg/md/sm/xs-push-*:右移; ...
  • js元素綁定事件 想給一個元素綁定一個方法之後,在綁定一個方法而且不被覆蓋 window.onload = function () { alert('a'); } window.onlaod=function(){ alert('b') } 我們發現它只彈出一個,有一個被覆蓋了 下麵就說一下js中的 ...
  • 在JavaScript中,RegExp對象表示正則表達式,用來對字元串進行匹配。 一、兩種定義方法: 1、直接量法: /pattern/attribute 2、對象法: new RegExp(pattern,attribute); 參數說明: pattern是一個字元串,指定了正則表達式的模式或其他 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...