首頁 web前端 js教程 關於Node.js 子程序與應用的介紹

關於Node.js 子程序與應用的介紹

Jun 30, 2018 pm 02:57 PM
node nodejs 子行程

這篇文章主要介紹了淺談Node.js 子進程與應用場景,內容挺不錯的,現在分享給大家,也給大家做個參考。

背景

由於ons(阿里雲RocketMQ 套件)基於C艹封裝而來,不支援單一進程內實例化多個生產者與消費者,為了解決這個問題,使用了Node.js 子程序。

在使用的過程中碰到的坑

發布:進程管理關閉主進程後,子進程變成作業系統進程(pid 為1)

#幾個解決方案

將子進程看做獨立運行的進程,記錄pid,發佈時進程管理關閉主進程同時關閉子進程

#主程序監聽關閉事件,主動關閉從屬於自己的子程序

子程序種類

  1. ##spawn:執行指令

  2. exec:執行指令(新shell)

  3. #execFile:執行檔

  4. fork:執行文件

子程序常用事件

  1. #exit

  2. close

  3. error

  4. message

#close 與exit 是有區別的,close 是在資料流關閉時觸發的事件,exit 是在子進程退出時觸發的事件。因為多個子程序可以共享同一個資料流,所以當某個子程序 exit 時不一定會觸發 close 事件,因為這個時候還有其他子程序在使用資料流。

子程序資料流

  1. stdin

  2. stdout

  3. stderr

因為是以主程序為出發點,所以子程序的資料流與常規理解的資料流方向相反,stdin:寫入流,stdout、stderr:讀取流。

spawn

spawn(command[, args][, options])
登入後複製

#執行一條指令,透過 data 資料流傳回各種執行結果。

基礎使用

const { spawn } = require('child_process');

const child = spawn('find', [ '.', '-type', 'f' ]);
child.stdout.on('data', (data) => {
  console.log(`child stdout:\n${data}`);
});

child.stderr.on('data', (data) => {
  console.error(`child stderr:\n${data}`);
});

child.on('exit', (code, signal) => {
  console.log(`child process exit with: code $[code], signal: ${signal}`);
});
登入後複製

#常用參數

{
  cwd: String,
  env: Object,
  stdio: Array | String,
  detached: Boolean,
  shell: Boolean,
  uid: Number,
  gid: Number
}
登入後複製

重點說明下detached 屬性,detached 設定為true 是為子進程獨立運行做準備。子程序的具體行為與作業系統相關,不同系統表現不同,Windows 系統子程序會擁有自己的控制台窗口,POSIX 系統子程序會成為新程序組與會話負責人。

這個時候子進程還沒有完全獨立,子進程的運行結果會展示在主進程設定的資料流上,並且主進程退出會影響子進程運行。當 stdio 設定為 ignore 並呼叫 child.unref(); 子程序開始真正獨立運行,主程序可獨立退出。

exec

exec(command[, options][, callback])
登入後複製

#執行一條指令,透過回呼參數傳回結果,指令未執行完時會快取部分結果到系統記憶體。

const { exec } = require('child_process');

exec('find . -type f | wc -l', (err, stdout, stderr) => {
  if (err) {
    console.error(`exec error: ${err}`);
    return;
  }

  console.log(`Number of files ${stdout}`);
});
登入後複製

兩全其美- spawn 取代exec

由於exec 的結果是一次返回,在返回前是快取在記憶體中的,所以在執行的shell 指令輸出過大時,使用exec 執行指令的方式就無法依期望完成我們的工作,這個時候可以使用spawn 取代exec 執行shell 指令。

const { spawn } = require('child_process');

const child = spawn('find . -type f | wc -l', {
  stdio: 'inherit',
  shell: true
});

child.stdout.on('data', (data) => {
  console.log(`child stdout:\n${data}`);
});

child.stderr.on('data', (data) => {
  console.error(`child stderr:\n${data}`);
});

child.on('exit', (code, signal) => {
  console.log(`child process exit with: code $[code], signal: ${signal}`);
});
登入後複製

execFile

#

child_process.execFile(file[, args][, options][, callback])
登入後複製

執行一個檔案

與exec 功能基本上相同,不同之處在於執行給定路徑的一個腳本文件,並且是直接創建一個新的進程,而不是創建一個shell 環境再去運行腳本,相對更輕量級更有效率。但是在 Windows 系統中如 .cmd 、 .bat 等檔案無法直接執行,這是 execFile 就無法運作,可以使用 spawn、exec 來取代。

fork

child_process.fork(modulePath[, args][, options])
登入後複製

#執行一個Node.js 檔案

// parent.js

const { fork } = require('child_process');

const child = fork('child.js');

child.on('message', (msg) => {
  console.log('Message from child', msg);
});

child.send({ hello: 'world' });
登入後複製

// child.js

process.on('message', (msg) => {
  console.log('Message from parent:', msg);
});

let counter = 0;

setInterval(() => {
  process.send({ counter: counter++ });
}, 3000);
登入後複製

fork 實際上是spawn 的特殊形式,固定spawn Node.js 進程,並且在主子進程間建立了通訊通道,讓主子進程可以使用process 模組基於事件進行通訊。

子程序使用場景

  1. 計算密集型系統

  2. ##前端建置工具利用多核心CPU平行運算,提升建置效率
  3. 流程管理工具,如:PM2 中部分功能
  4. 以上就是本文的全部內容,希望對大家的學習有幫助,更多相關內容請關注PHP中文網!

相關推薦:

Webpack優化設定縮小檔案搜尋範圍的介紹


Node.js中Request模組處理HTTP協定請求的使用介紹

#

Node.js下自訂錯誤類型的解析

#

以上是關於Node.js 子程序與應用的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nodejs是後端框架嗎 nodejs是後端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為後端框架使用,因為它提供高效能、可擴展性、跨平台支援、豐富的生態系統和易於開發等功能。

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

nodejs中的全域變數有哪些 nodejs中的全域變數有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Pi Node教學:什麼是Pi節點?如何安裝和設定Pi Node? Mar 05, 2025 pm 05:57 PM

PiNetwork節點詳解及安裝指南本文將詳細介紹PiNetwork生態系統中的關鍵角色——Pi節點,並提供安裝和配置的完整步驟。 Pi節點在PiNetwork區塊鏈測試網推出後,成為眾多先鋒積極參與測試的重要環節,為即將到來的主網發布做準備。如果您還不了解PiNetwork,請參考Pi幣是什麼?上市價格多少? Pi用途、挖礦及安全性分析。什麼是PiNetwork? PiNetwork項目始於2019年,擁有其專屬加密貨幣Pi幣。該項目旨在創建一個人人可參與

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

nodejs是後端開發語言嗎 nodejs是後端開發語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種後端開發語言。它用於後端開發,包括處理伺服器端業務邏輯、管理資料庫連接和提供 API。

nodejs和java選哪個 nodejs和java選哪個 Apr 21, 2024 am 04:40 AM

Node.js 和 Java 在 Web 開發中各有優劣,因此選擇取決於專案需求。 Node.js 擅長即時應用程式、快速開發和微服務架構,而 Java 則在企業級支援、效能和安全性方面佔優。

See all articles